Как ориентироваться в флаттере с блоком

У меня есть страница входа / регистрации. Когда пользователь регистрируется, я вызываю код своего блока и выполняю регистрацию на базе Firebase. Теперь, когда я завершу регистрацию, я хочу, чтобы приложение было перенаправлено на домашнюю страницу. Как я могу контролировать поток навигации из блока?

Я попытался использовать поток firebase authstatechanges в "доме" материального приложения, но это работает только при первом запуске приложения. Это не работает после того, как я уже загрузил страницу регистрации.

Также я создал метод для прослушивания логического значения потока, которое изменяется, когда пользователь зарегистрирован, но этот метод не получает никаких обновлений.

class EventsBloc{

    final FirebaseAuth firebaseAuth = FirebaseAuth.instance;

    Sink<User> get doSignup => _signupController.sink;

    final _signupController = StreamController<User>();

    Stream<bool> get isLoading => _isLoadingSubject.stream;

    final _isLoadingSubject = BehaviorSubject<bool>(seedValue: false);



    EventsBloc()
    {
      _signupController.stream.listen((user){

        _isLoadingSubject.add(true);
        firebaseAuth.createUserWithEmailAndPassword(email: user.email, password: user.password).then((firebaseUser) {

          _isLoadingSubject.add(false);
           // I WANT TO NAVIGATE TO THE HOME PAGE HERE
          Firestore.instance.collection('user').document()
              .setData({ 'email': user.email, 'phone': user.phoneNumber, 'name': user.name });


        });

      });
    }


  }

1 ответ

Решение

Я думаю, что поток состояния аутентификации в родительском StreamBuilder должно сработать? Это было бы самым хорошим способом, по моему мнению.

Можно добавить новый поток в свой блок, например, Stream<String> get doNavigateи добавьте к нему события, когда вы хотите, чтобы виджет перемещался куда-то. Вы можете думать о навигационных действиях как о еще одном выходном потоке из вашего блока.

Еще один вариант - расширить сферу isLoading включить информацию, такую ​​как статус входа в систему тоже. Вы можете иметь перечисление со всеми возможными статусами, такими как:

enum Status { signedOut, loading, signedIn }

А затем выставить его из вашего блока, а не только состояние загрузки:

class EventBloc {
  // ...
  Stream<Status> get status => _statusSubject.stream;
  final _statusSubject = BehaviorSubject<Status>(seedValue: Status.signedOut);

  EventsBloc() {
    _signupController.stream.listen((user) async {
      _statusSubject.add(Status.loading);
      final firebaseUser = await firebaseAuth.createUserWithEmailAndPassword(
        email: user.email,
        password: user.password,
      );
      Firestore.instance.collection('user').document().setData(
          {'email': user.email, 'phone': user.phoneNumber, 'name': user.name});
      _statusSubject.add(Status.signedIn);
    });
  }
}```
Другие вопросы по тегам