Search code examples
flutterrxdart

how to convert rxdart Observable to Stream


I was looking at code at git for firebase auth and it works fine, but a problem came when, I upgrade dependencies, particularly for rxdart from ^0.21.0 to current (^0.24.1), I see other question that refer to

The Observable can be replaced by Stream in accepted answer. I am able to change

Observable<FirebaseUser> user; // firebase user
..
user = Observable(_auth.onAuthStateChanged);

to

Stream<FirebaseUser> user; // firebase user
..
user = _auth.onAuthStateChanged;

but

Observable<Map<String, dynamic>> profile; // custom user data in Firestore
..
profile = user.switchMap((FirebaseUser u) {
      if (u != null) {
        return _db
            .collection('users')
            .document(u.uid)
            .snapshots()
            .map((snap) => snap.data);
      } else {
        return Observable.just({});
      }
    });

I tried

Object profile;
..
user.map( (FirebaseUser u) {
      if (u != null) {
        return _db
            .collection('users')
            .document(u.uid)
            .snapshots()
            .map((snap) => snap.data);
      } else {
        return Stream.empty();
      }
    });

But it does not get trigger the listen and the user profile is not read.


Solution

  • You can use it like this

    Stream<Map<String, dynamic>> profile = user.switchMap((u) {
          if (u != null) {
            return _db
                .collection('users')
                .document(u.uid)
                .snapshots()
                .map((snap) => snap.data);
          } else {
            return Stream.value({});
          }
        });