【问题标题】:Flutter merge multiple streams flutter to perform OR queries in firestoreFlutter 合并多个流 Flutter 以在 Firestore 中执行 OR 查询
【发布时间】:2021-06-05 09:10:37
【问题描述】:

在这段代码中,我尝试检索符合以下逻辑的数据:if (title == query || subtitle == query)。这里我的代码使用MergeStream of RxDart

  //if (title == query)
  Stream<QuerySnapshot> searchProgramsByTitle(String query) async* {
    if (query.length == 0) {
      yield* fireStore.collection('programs').orderBy('listened', descending: true).snapshots();
    }
    else {
      yield* fireStore.collection('programs').where('title', isEqualTo: query).orderBy('listened', descending: true).snapshots();
    }
  }
  
  //if (subtitle == query)
  Stream<QuerySnapshot> searchProgramsBySubtitle(String query) async* {
    if (query.length == 0) {
      yield* fireStore.collection('programs').orderBy('listened', descending: true).snapshots();
    }
    else {
      yield* fireStore.collection('programs').where('subtitle', isEqualTo: query).orderBy('listened', descending: true).snapshots();
    }
  }
  
  // OR query
  Stream<QuerySnapshot> searchPrograms(String query) async* {
    Stream<QuerySnapshot> stream1 = searchProgramsByTitle(query);
    Stream<QuerySnapshot> stream2 = searchProgramsBySubtitle(query);
    yield* MergeStream([stream1, stream2]);
  }

searchProgramsByTitlesearchProgramsBySubtitle 分别工作正常。但是searchPrograms 不起作用。我错过了什么?

【问题讨论】:

  • “但是 searchPrograms 不起作用” - 解释一下doesn't work
  • 它不返回 Firestore 数据。如果我更改MergeStream([stream1]);MergeStream([stream2]);。没关系。
  • 所以两个流都不是空的,pub.dev/documentation/rxdart/latest/rx/MergeStream-class.html 的例子对你有用吗?如果您将这两个输入流替换为您的输入流会怎样?你看到了什么?
  • 最后的数据是1。我想我明白你的意思了。那么我该如何解决呢?
  • CombineLatestStream 也许?文档说:“只要任何源流序列发出一个项目,就使用combiner 函数将给定的流合并到一个流序列中。”

标签: flutter google-cloud-firestore rxdart


【解决方案1】:

感谢 pskink 的这些可爱的回答。我设法解决了这个问题:


  Stream<List> searchPrograms(String query) async* {
    Stream<QuerySnapshot> stream1 = searchProgramsByTitle(query);
    Stream<QuerySnapshot> stream2 = searchProgramsBySubtitle(query);
    yield* rx.CombineLatestStream.combine2(stream1, stream2, (QuerySnapshot a, QuerySnapshot b) => [...a.docs.map((e) => e.id), ...b.docs.map((e) => e.id)]);
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2020-01-27
    • 2019-12-03
    • 2018-10-23
    • 2019-04-16
    • 2019-05-14
    • 2023-04-08
    • 2020-10-10
    相关资源
    最近更新 更多