我的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());
}
最佳答案
concat在stream1完成之前不会读取stream2
这就是为什么它仅侦听第一流的原因。因为它必须先完成第一个流,然后才能移至下一个流,到那时为时已晚,因为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
}