在颤振中使用流

时间:2020-12-28 22:40:14

标签: flutter google-cloud-firestore stream chat stream-builder

我正在开发聊天应用程序,我正在尝试使用分页从 Firestore 中检索有限数量的数据,并在用户不断滚动时检索其余数据,我还想监听数据库中的最新更改并显示它给用户。我尝试通过在构造函数中创建一个包含快照侦听器的 Stream 类来做到这一点,并向流控制器添加任何新更改,它还具有检索分页数据并在用户滚动时将其添加到流控制器的方法。问题是当从数据库中检索数据并将其添加到流控制器时,它会替换以前的数据而不是添加到其中。下面是我创建的类<​​/p>

class ChatStream {
  final String messageId;
  final _controller = StreamController<QuerySnapshot>();
  var _snapshots;
  
  ChatStream({this.messageId}) {
    _snapshots = FirebaseFirestore.instance
        .collection("chats")
        .doc(messageId)
        .collection("messages")
        .orderBy("time", descending: false)
        .limitToLast(10)
        .snapshots();

    _snapshots.listen((onData) {
      _controller.sink.add(onData);
    });
  }
  getChats(DocumentSnapshot lastDocument) async {
    FirebaseFirestore.instance
        .collection("chats")
        .doc(messageId)
        .collection("messages")
        .orderBy("time", descending: false)
        .endBeforeDocument(lastDocument)
        .limitToLast(100)
        .snapshots()
        .forEach((action) {
      _controller.sink.add(action);
    });
  }

  Stream get stream {
    return _controller.stream;
  }
}

我创建了一个名为 c 的 ChatStream 类型的对象,然后我使用 c.stream 获取流以在流构建器中使用,我在 initState 方法中使用滚动侦听器调用 getChats 方法,如下所示< /p>

 _scrollController.addListener(() {
      double maxScroll = _scrollController.position.minScrollExtent;
      double currentScroll = _scrollController.position.pixels;
      double delta = MediaQuery.of(context).size.height * 0.20;
      if (maxScroll == currentScroll) {
     
      c.getChats(lastDocument);
      }


    });

1 个答案:

答案 0 :(得分:0)

Firestore API 根本无法轻松执行分页和同时获取实时更新。如果你想正确地做到这一点,你将不得不付出很多努力,分别为每页数据添加侦听器,并处理查询结果改变位置时的所有边缘情况