firebase - 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());
}
解决方案
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
}
推荐阅读
- java - 如何从 URL 在 webView 中加载 PDF?
- android - 为什么 Android 10 HTTPUrlConnection 失败?9日工作正常
- html - Ngx-Bootstrap 内联日期选择器解决方法
- c# - 我无法在 foreach 循环内的列表中添加项目如何解决?
- javascript - 防止保存对话框出现在 Ctrl S
- java - 错误运行Spring Boot(通过字段表示的不满足的依赖关系)
- kubernetes - 如何获取 OpenShift/K8s 资源的模式,例如如何获取部署配置或 pod 的模式定义
- html - 为什么我的 div 列表超出其父级?
- java - Java Pusher 客户端在连接后立即断开连接
- android - 如何在添加项目之前确定列表视图的高度