Как инициировать второй поток в зависимости от событий из первого потока? - PullRequest
1 голос
/ 03 апреля 2019

В моем BLOC мне нужно прослушать FirebaseAuth.instance.onAuthStateChanged и в зависимости от пользователей uid запустит второй поток Firestore.instance.collection('accounts/${uid}/private').snapshots() и объединит результаты в одну модель:

    class MyPageModel {
      bool userSignedIn;
      List<String> privateData;
    }

Эта модель должна быть передана с BehaviorSubject. Как лучше всего использовать rxdart для этой задачи?

1 Ответ

1 голос
/ 05 апреля 2019

Проверьте код ниже, чтобы увидеть, как вы можете объединить два условных потока:

class TheBLoC{
  BehaviorSubject<MyPageModel> _userDataSubject = BehaviorSubject<MyPageModel>();
  // use this in your StreamBuilder widget
  Stream<MyPageModel> get userData => _userDataSubject.stream;
  // a reference to the stream of the user's private data
  StreamSubscription<QuerySnapshot> _subscription;
  // bool with the state of the user so we make sure we don't show any data 
  // unless the user is currently loggedin.
  bool isUserLoggedIn;

  TheBLoC() {
    isUserLoggedIn = false;
    FirebaseAuth.instance.onAuthStateChanged.listen((firebaseUser) {
      if (firebaseUser.isAnonymous()) {
        isUserLoggedIn = false;
        final event = MyPageModel();
        event.isSignedIn = false;
        _userDataSubject.add(event);
        // cancel the previous _subscription if available
        _subscription?.cancel();
        // should also probably nullify the _subscription reference 
      } else {
        isUserLoggedIn = true;
        // the user is logged in so acces his's data
        _subscription = Firestore.instance.collection
          ('accounts/${firebaseUser.uid}/private')
            .snapshots().listen((querySnapshots){              
              if(!isUserLoggedIn) return;
              final event = MyPageModel();              
              event.isSignedIn = true;
              // use the querySnapshots to initialize the privateData in 
              // MyPageModel
              _userDataSubject.add(event);
        });
      }
    });
  }

}
...