【问题标题】:Firestore merge 2 queries with FlutterFirestore 使用 Flutter 合并 2 个查询
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经尝试使用 RxDart 但我缺乏信息。你有一些工作代码或其他提示可以帮助我吗?谢谢
    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2018-10-23
    • 2021-09-12
    • 2020-02-04
    • 2021-06-05
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多