Flutter Combine Multiple FireStore Streams With Rxdart

829

Add this code last operation

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([]);
    });

}

Share:
829
Namus Keyfe
Author by

Namus Keyfe

Updated on December 15, 2022

Comments

  • Namus Keyfe
    Namus Keyfe over 1 year

    I think I need to merge it together somewhere, but I can't find out how and where. I want to use in StreamBuilder ? I brought you up here waiting for your help..

    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));
          });
        });
      }