Firestore与Flutter合并2个查询

问题描述 投票:0回答:1

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

firebase flutter dart stream google-cloud-firestore
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.