Firestore使用Flutter合并2个查询

时间:2019-09-27 14:08:38

标签: firebase flutter dart stream google-cloud-firestore

我正在尝试对Firestore进行2次查询,并将结果合并为一个,以模拟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;
  }

在我的Bloc中,我有以下代码应该相应地更新我的视图的数据库状态,但是它不起作用。数据库插入工作正常,但是视图没有刷新,我也不知道为什么。

_gardensSubscription?.cancel();
    _gardensSubscription = _dataRepository.gardens(event.userId).listen(
          (gardens) {
        dispatch(
          GardensUpdated(gardens),
        );
      },
    );

我对Stream尤其是StreamController进程不太满意。是否可以更轻松地完成此任务?

1 个答案:

答案 0 :(得分:0)

是时候使用RxDart的强大功能了:https://pub.dev/packages/rxdart

您不能使用此lib进行所有类型的流转换。

例如,您可以使用合并运算符精确实现所需的目标