Я пытаюсь сделать 2 запроса к Firestore и объединить результаты в один для имитации запроса Firestore OR.
Я сегментировал свой код в соответствии с шаблоном блока.
///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.Можно ли выполнить эту задачу проще?