Flutter bloc同时添加2个事件

Posted

技术标签:

【中文标题】Flutter bloc同时添加2个事件【英文标题】:Flutter bloc adding 2 event in same time 【发布时间】:2021-04-20 23:55:59 【问题描述】:

我想在我的应用中检查用户的互联网连接和 Firebase 身份验证状态更改。我正在使用颤振块进行应用程序的状态管理。但是,当在一个 initstate 中调用不同的 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();
  

【问题讨论】:

【参考方案1】:

如果我的理解是正确的,那么在我看来,您正试图用一个 BLoC 解决两个不同的问题。我看不出为什么互联网连接和用户身份验证必须在一个 BLoC 中,而是我将两者分开放在不同的 BLoC 中。

正如this thread points out 中的讨论,使用 BLoC 的重点围绕着可预测性的目的。您可以覆盖现有的 BLoC 事件流,但我个人认为这对于您想要做的事情来说太复杂了。

所以我建议,要么制作两个单独的 BLoC,要么将整个过程合并到一个事件中,在用户通过身份验证之前检查互联网连接,然后根据错误返回不同的状态。

【讨论】:

以上是关于Flutter bloc同时添加2个事件的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 转换颤振 bloc 事件以添加去抖动

Flutter BLoC 事件竞争条件

从 v7.2.1 迁移到 flutter_bloc v 8.0.0 后不会触发 flutter_bloc 事件

Flutter BLoC 模式 - 如何在流事件后导航到另一个屏幕?

Flutter_bloc 从没有 UI 事件的 firestore 获取更新的数据

Flutter BLoC - 如何将参数传递给事件?