Блок Flutter добавляет 2 события одновременно

Я хочу проверить подключение пользователей к Интернету и изменения состояния аутентификации firebase в моем приложении. Я использую блок флаттера для управления состоянием моего приложения. Но при вызове разных 2 .add(event) в одном состоянии инициализации всегда первый запускается и меняет состояния, а второй не запускается и не меняет состояние. В чем моя ошибка?

мой блок:

class ControllerBloc extends Bloc<ControllerEvent, ControllerState> {
  ControllerBloc() : super(ControllerInitial());
  AuthApiClient _authApiClient = getIt<AuthApiClient>();

  @override
  Stream<ControllerState> mapEventToState(
    ControllerEvent event,
  ) async* {
    if (event is ControllInternetConnection) {
      yield* internetControll();
    }
    if (event is ControllUserAuth) {
      debugPrint("wwwwgeldi");
      yield* userAuthControl();
    }
    // TODO: implement mapEventToState
  }

  Stream<ControllerState> internetControll() async* {
    Stream<DataConnectionStatus> connectionState =
        DataConnectionChecker().onStatusChange;
    await for (DataConnectionStatus status in connectionState) {
      switch (status) {
        case DataConnectionStatus.connected:
          debugPrint("Bağlandı");
          yield InternetConnectedState();
          break;
        case DataConnectionStatus.disconnected:
          debugPrint("Kesildi");
          yield InternetConnectionLostState();
          break;
      }
    }
  }

  Stream<ControllerState> userAuthControl() async* {
    FirebaseAuth firebaseAuth = _authApiClient.authInstanceAl();
    debugPrint("geldi");
    Stream<User> authStream = firebaseAuth.authStateChanges();

    _authApiClient.authInstanceAl().signOut();

    await for (User authUserResult in authStream) {
      if (authUserResult == null) {
        yield UserAuthControlError();
      }
    }
  }
}

моя страница, где называют мои события

class _NavigationPageState extends State<NavigationPage> {
  ControllerBloc controllerBloc;

   

  @override
  void initState() {
    controllerBloc= BlocProvider.of<ControllerBloc>(context);
    controllerBloc.add(ControllInternetConnection());
    controllerBloc.add(ControllUserAuth());
    super.initState();
  }

person guccisekspir    schedule 15.01.2021    source источник


Ответы (1)


Если я правильно понимаю, мне кажется, что вы пытаетесь решить две разные проблемы с помощью одного BLoC. Я не вижу причин, по которым подключение к Интернету и аутентификация пользователя должны быть в одном BLoC, скорее я бы просто разделил их на отдельные BLoC.

Как указано в обсуждении в этой ветке, смысл использования BLoC вращается вокруг идея предсказуемости целей. Вы можете переопределить существующий поток событий BLoC, но я лично считаю, что это слишком сложно для того, что вы пытаетесь сделать.

Поэтому я бы предложил либо сделать два отдельных BLoC, либо объединить весь процесс в одно событие, где интернет-соединение будет проверяться до аутентификации пользователя, а затем вы будете возвращать разные состояния в зависимости от ошибок.

person Agustinus Theodorus    schedule 18.05.2021