Почему этот широковещательный поток не работает, когда я добавляю второго слушателя

#flutter #firebase-authentication

# #flutter #firebase-аутентификация

Вопрос:

Я не могу понять, почему этот широковещательный поток не работает.

Я отправляю данные из _auth.onAuthStateChanged на новый StreamController, чтобы я мог больше контролировать поток.

Приведенный ниже код работает нормально, но как только я раскомментирую строку _userStream.listen(_handleUserStream); , поток перестает работать, хотя пользовательский поток является широковещательным потоком.

Я попытался инициализировать StreamController как StreamController.broadcast() , но тогда он вообще не работает даже с одним слушателем.

 class AuthService() {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  StreamController<FirebaseUser> _userStreamController;
  Stream<User> _userStream;
  Stream<User> get userStream => _userStream;


  AuthService() {
    initStream();
  }

  initStream() async {
    _userStreamController = StreamController<FirebaseUser>();
    _userStream = _userStreamController.stream
        .asBroadcastStream()
        .asyncMap(_userFromFirebaseUser);

    _auth.onAuthStateChanged.listen((event) {
      _userStreamController.add(event);
    });

    // _userStream.listen(_handleUserStream);
  }

  ... other methods
}
 

Ответ №1:

Вы можете инициализировать StreamController в первой строке initStream напрямую как широковещательный поток, а затем вы можете использовать поток напрямую, как показано ниже

 class AuthService() {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  StreamController<FirebaseUser> _userStreamController;
  Stream<User> _userStream;
  Stream<User> get userStream => _userStream;


  AuthService() {
    initStream();
  }

  initStream() async {
    _userStreamController = StreamController.broadcast();
    _userStream = _userStreamController.stream;

    _userStream.listen(_handleUserStream);

    _auth.onAuthStateChanged.listen((event) {
      _userStreamController.add(event);
    });
  }

  ... other methods
}
 

Комментарии:

1. Как я уже сказал, я пытался инициализировать как a StreamController.broadcast() , но безуспешно. Вы пробовали это, и это сработало?

2. Можете ли вы поместить точку останова или оператор печати внутри прослушивателя onAuthStateChanged, чтобы подтвердить, что события действительно поступают