Flutter 颤振合并多个流颤振在firestore中执行或查询

Flutter 颤振合并多个流颤振在firestore中执行或查询,flutter,google-cloud-firestore,rxdart,Flutter,Google Cloud Firestore,Rxdart,在这段代码中,我尝试检索与此逻辑匹配的数据:if(title==query | | subtitle==query)。这里我的代码使用了RxDart的MergeStream: //if (title == query) Stream<QuerySnapshot> searchProgramsByTitle(String query) async* { if (query.length == 0) { yield* fireStore.collection(

在这段代码中,我尝试检索与此逻辑匹配的数据:
if(title==query | | subtitle==query)
。这里我的代码使用了
RxDart
MergeStream

  //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]);
  }
//如果(title==query)
流搜索程序字节(字符串查询)异步*{
if(query.length==0){
yield*fireStore.collection('programs').orderBy('seeded',descending:true.snapshots();
}
否则{
yield*fireStore.collection('programs')。其中('title',isEqualTo:query)。orderBy('seeded',descending:true)。snapshots();
}
}
//if(subtitle==查询)
Stream searchProgramsBySubtitle(字符串查询)异步*{
if(query.length==0){
yield*fireStore.collection('programs').orderBy('seeded',descending:true.snapshots();
}
否则{
yield*fireStore.collection('programs')。其中('subtitle',isEqualTo:query)。orderBy('seeded',descending:true)。snapshots();
}
}
//或查询
流搜索程序(字符串查询)异步*{
stream1=搜索程序字节(查询);
stream2=searchProgramsBySubtitle(查询);
收益率*合并流([stream1,stream2]);
}

searchProgramsByTitle
searchProgramsBySubtitle
分别运行良好。但是
searchPrograms
不起作用。我错过了什么?

多亏了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)]);
  }

流搜索程序(字符串查询)异步*{
stream1=搜索程序字节(查询);
stream2=searchProgramsBySubtitle(查询);
收益率*rx.CombineLatestStream.combine2(stream1,stream2,(QuerySnapshot a,QuerySnapshot b)=>[…a.docs.map((e)=>e.id),…b.docs.map((e)=>e.id)];
}

“但是搜索程序不工作”-解释
不工作
它不返回firestore数据。如果我更改
MergeStream([stream1])
合并流([stream2])。没关系,所以两个流都不是空的,这个例子对你有用吗?如果您将这两个输入流替换为您的输入流呢?你看到了什么?最终数据是1。我想我明白你的意思了。那么我该如何修复它呢?大概文档中说:“每当任何源流序列发出一个项目时,通过使用
combiner
函数将给定的流合并成一个流序列。”