Как запустить второй поток в зависимости от событий из первого потока?

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

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

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


person user1717140    schedule 03.04.2019    source источник
comment
Из вашего BLoC вы хотите выставить только Stream MyPageModel? Или вы хотите также открыть состояние аутентификации?   -  person user    schedule 03.04.2019
comment
Только MyPageModel. Если пользователь не вошел в систему, установите для userSignedIn значение false, в противном случае userSignedIn = true и privateData заполните   -  person user1717140    schedule 03.04.2019
comment
Спасибо, все работает нормально. Не могли бы вы оставить свой комментарий в качестве ответа. Проверю как решение.   -  person user1717140    schedule 04.04.2019


Ответы (1)


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

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

}
person user    schedule 05.04.2019