Concanete 2 firestore QuerySnapShot 流在 RxDart 的 dart-flutter 中
Concanete 2 firestore QuerySnapShot streams in dart-flutter by RxDart
我的 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 waits to subscribe to each additional Observable that you pass
to it until the previous Observable completes.
concat 在 stream1 完成之前不会读取 stream2
Concat will not see, and therefore will not emit, any items that
Observable emits before all previous Observables complete
这就是它只监听第一个流的原因。因为它必须在移动到下一个流之前完成第一个流,到那时已经太晚了,因为 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
}
我的 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 waits to subscribe to each additional Observable that you pass to it until the previous Observable completes.
concat 在 stream1 完成之前不会读取 stream2
Concat will not see, and therefore will not emit, any items that Observable emits before all previous Observables complete
这就是它只监听第一个流的原因。因为它必须在移动到下一个流之前完成第一个流,到那时已经太晚了,因为 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
}