首页 > 解决方案 > RxDart 的 dart-flutter 中的 Concanete 2 firestore QuerySnapShot 流

问题描述

我的 Flutter 项目有一个 StreamBuilder 小部件。它侦听Firestore 查询快照流。如果我只使用一个查询流就没有问题,每一件事都按我的预期工作。但是,如果我连接 2 个流,那么它只听第一个流。我认为,stream1 不会发出所有数据,因此 stream2 不会附加到结果流中。但我不知道我该如何解决这个问题。

我很感激任何帮助。谢谢。

Stream<List<MyLog>> myLogStream() {
    Stream<QuerySnapshot> stream1 = Firestore.instance
        .collection('devicelog/1/mylog')
        .snapshots();
    Stream<QuerySnapshot> stream2 = Firestore.instance
        .collection('devicelog/2/mylog')
        .snapshots();
    return Rx.concat([stream1, stream2]).map((qShot) => qShot.documents
        .map((doc) => MyLog.fromCloud(doc.documentID, doc.data))
        .toList());
}

标签: firebaseflutterdartgoogle-cloud-firestorerxdart

解决方案


Concat 等待订阅您传递给它的每个额外的 Observable,直到前一个 Observable 完成。

concat 在 stream1 完成之前不会读取 stream2

Concat 不会看到,因此也不会发射 Observable 在所有之前的 Observable 完成之前发射的任何项目

这就是为什么它只听第一个流。因为它必须在移动到下一个流之前完成第一个流,到那时为时已晚,因为 stream2 已经发出了一些项目

您可能正在寻找的是 Rx.combineLatest 所以您将 stream1 stream2 发出的每个对象组合成一个对象,该对象会发送到 stream3

Stream<List<MyLog>> myLogStream() {
  Stream<QuerySnapshot> stream1 =
      Firestore.instance.collection('devicelog/1/mylog').snapshots();
  Stream<QuerySnapshot> stream2 =
      Firestore.instance.collection('devicelog/2/mylog').snapshots();
  return Rx.combineLatest2(stream1, stream2,
      _fun_That_Combines_Each_Object_From_stream1_And_stream2);
}

QuerySnapshot _fun_That_Combines_Each_Object_From_stream1_And_stream2(
    QuerySnapshot mylog1, QuerySnapshot mylog2) {
      // do some magic
    }

推荐阅读