Flutter将多个FireStore流与Rxdart结合

时间:2019-11-29 18:59:49

标签: flutter dart stream observable rxdart

我认为我需要将其合并到某个位置,但是我找不到方法和位置。我要在StreamBuilder中使用吗?我带你到这里来等待您的帮助。

getCombinedMatches(uid) {
    return Firestore.instance
        .collection('matches')
        .where('match', arrayContains: uid)
        .snapshots()
        .map((convert) {
      return convert.documents.map((f) {
        Observable<Matches> match = f.reference
            .snapshots()
            .map<Matches>((document) => Matches.fromMap(document.data));
        Observable<User> user = Firestore.instance
            .collection("users")
            .document(uid)
            .snapshots()
            .map<User>((document) => User.fromMap(document.data));

        Observable<Message> message = Firestore.instance
            .collection('matches')
            .document(f.documentID)
            .collection("chat")
            .orderBy('dater', descending: true)
            .limit(1)
            .snapshots()
            .expand((snapShot) => snapShot.documents)
            .map<Message>((document) => Message.fromMap(document.data));

        return Observable.combineLatest3(match, user, message,
            (matches, user, message) => CombinedStream(matches, user, message));
      });
    });
  }

2 个答案:

答案 0 :(得分:2)

在最后一次操作中添加此代码

getCombinedMatches(uid) {
return Observable(Firestore.instance
    .collection('matches')
    .where('match', arrayContains: uid)
    .snapshots())
    .map((convert) {
  return convert.documents.map((f) {
    Stream<Matches> match = f.reference
        .snapshots()
        .map<Matches>((document) => Matches.fromMap(document.data));
    Stream<User> user = Firestore.instance
        .collection("users")
        .document(uid)
        .snapshots()
        .map<User>((document) => User.fromMap(document.data));

    Stream<Message> message = Firestore.instance
        .collection('matches')
        .document(f.documentID)
        .collection("chat")
        .orderBy('dater', descending: true)
        .limit(1)
        .snapshots()
        .expand((snapShot) => snapShot.documents)
        .map<Message>((document) => Message.fromMap(document.data));

    return Observable.combineLatest3(match, user, message,
        (matches, user, message) => CombinedStream(matches, user, message));
  });
}).switchMap((observables) {
      return observables.length > 0
          ? Observable.combineLatestList(observables)
          : Observable.just([]);
    });

}

答案 1 :(得分:0)

如果合并流,则StreamBuilder将仅显示合并流中的LAST事件。我相信您可以执行以下操作:

// snapshotList will be your AsyncSnapshot. snapshotList.data will be your List<QuerySnapshot>

StreamBuilder<List<QuerySnapshot>>(
    stream: streamList,
    builder: (BuildContext context, AsyncSnapshot<List<QuerySnapshot>> snapshotList) {
        snapshotList.data.forEach((document) {
            return something
        }
    }
)

让我知道是否有帮助