首页 > 解决方案 > Firestore 使用 Flutter 合并 2 个查询

问题描述

我正在尝试对 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 进程不太满意。是否可以更轻松地完成这项任务?

标签: firebaseflutterdartstreamgoogle-cloud-firestore

解决方案


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

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

例如,您可以使用合并运算符来实现您想要的


推荐阅读