首页 > 解决方案 > 如何在 Flutter 中检查来自 FireStore 的新数据

问题描述

基本上我有一个聊天应用程序。每当出现新数据时,我都想要检查滚动位置并运行一些代码。问题是如何检查何时从 Firestore 获取新数据。

这是我的基本聊天应用程序代码。

    class Mess {...}//factory

class Body extends StatefulWidget {...}

class _BodyState extends State<Body> {
  List<Mess> _messages = [];
  StreamSubscription _messSubs;
  ScrollController _scrollController;
  double _scrollPosition;
  bool yeniMesajVar = false;

  _scrollListener() {
    setState(() {
      _scrollPosition = _scrollController.position.pixels;
    
    });
  }

  @override
  void initState() {
    _getMessages();
    super.initState();
    _scrollController = ScrollController();
    _scrollController.addListener(_scrollListener);
  }

  void _getMessages() {
    final FirebaseFirestore _db = FirebaseFirestore.instance;

    _messSubs = _db
        .collection('ChatRoom')
        .doc(widget.routes)
        .collection("messages")
        .orderBy("createdAt", descending: true)
        .snapshots()
        .listen((_mess) {
      _messages = _mess.docs.map((doc) => Mess.fromMap(doc.data())).toList();
      setState(() {});
    });
  }


  bool _isMe;
  TextEditingController _controller = TextEditingController();
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Column(
        children: [
          Expanded(
            child: ListView.builder(
                reverse: true,
                itemCount: _messages.length,
                itemBuilder: (BuildContext context, int idx) {
                  return Column(....)
                   

标签: firebasefluttergoogle-cloud-firestore

解决方案


您需要订阅由 生成的流.snapshots()才能做到这一点。将其应用于您的代码,它可能如下所示:

StreamSubscription subscription;
Stream stream = _db
    .collection('ChatRoom')
    .doc(widget.routes)
    .collection("messages")
    .orderBy("createdAt", descending: true)
    .snapshots()
subscription?.cancel();
subscription = stream.listen((_mess) {
  // do something
});

推荐阅读