【发布时间】:2020-01-27 21:04:49
【问题描述】:
我正在尝试对 Firestore 进行 2 个查询并将结果合并为一个以模拟 Firestore OR 查询。
我根据 bloc 模式对代码进行了分段。
///private method to zip QuerySnapshot streams
Stream<List<QuerySnapshot>> _combineStreams(String userId) {
var stream1 = todosCollection
.where("owners", arrayContains: userId)
.snapshots();
var stream2 = todosCollection
.where("contributors", arrayContains: userId)
.snapshots();
return StreamZip(([stream1, stream2])).asBroadcastStream();
}
///exposed method to be consumed by repository
Stream<List<Todo>> todos(String userId) {
var controller = StreamController<List<Todo>>();
_combineStreams(userId).listen((snapshots) {
List<DocumentSnapshot> documents = List<DocumentSnapshot>();
snapshots.forEach((snapshot) {
documents.addAll(snapshot.documents);
});
final todos = documents.map((doc) {
return Todo.fromEntity(TodoEntity.fromSnapshot(doc));
}).toList();
controller.add(todos);
});
return controller.stream;
}
在我的块中,我有以下代码应该相应地更新我的视图我的数据库状态,但它不工作。数据库插入工作,但视图没有刷新,我不知道为什么。
_gardensSubscription?.cancel();
_gardensSubscription = _dataRepository.gardens(event.userId).listen(
(gardens) {
dispatch(
GardensUpdated(gardens),
);
},
);
我对 Stream 尤其是 StreamController 进程不太满意。是否可以更轻松地完成这项任务?
【问题讨论】:
标签: firebase flutter dart stream google-cloud-firestore