【问题标题】:Concanete 2 firestore QuerySnapShot streams in dart-flutter by RxDartRxDart 的 dart-flutter 中的 Concanete 2 firestore QuerySnapShot 流
【发布时间】:2020-11-01 16:02:22
【问题描述】:

我的 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());
}

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore rxdart


    【解决方案1】:

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

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

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

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

    您可能正在寻找的是 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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2019-02-13
      • 2020-03-20
      • 2020-04-07
      • 2022-06-15
      • 2020-01-31
      相关资源
      最近更新 更多