这是在Flutter Bloc中等待事件的正确方式



我的应用程序越来越复杂,当我需要在事件之后执行代码时,我不知道如何处理事件的等待。现在我只是把事件后需要的代码放在Bloc中,现在我知道这不是办法,这让我的应用程序一团糟。这就是我管理应用程序的方式:

例如,如果我需要在后台添加一个用户,然后在视图/屏幕中执行一个操作:

BlocProvider.of<UserBloc>(context).add(AddUserEvent())

由于事件是异步的,我不能将代码放在那一行之后,所以在我正在制作的UserBloc内部:

on<HomeNavigationEvent>((event, emit) {
#Call backend api to create user

#Do my needed action
});

有时这甚至是最糟糕的,因为我需要调用另一个Bloc,所以我必须将上下文传递给该事件,比如:

BlocProvider.of<UserBloc>(context).add(AddUserEvent(context))
on<HomeNavigationEvent>((event, emit) {
#Call backend api to create user

BlocProvider.of<OtherBloc>(event.context).add(MyNeededActionEvent())
});

因此,我认为答案与Bloc侦听器有关,但我不知道如何检查事件而不是状态。我的意思是我不能这样做,因为我接收的是状态,而不是事件:

return BlocListener<UserBloc, UserState>(
listener: (context, state) {       #I would like to have (context, state, event))


if (event is AddUserEvent) {
#DO my needed action
}
})

[编辑]

我的应用程序的真实案例:

VehiculoBloc() : super(const VehiculoState(vehicle: null)) {

on<GetCurrentVehicle>((event, emit) async {

vehicle = await api.getCurrentVehicle();

final bool showVehicleButton = vehicle != null;
BlocProvider.of<HomeBloc>(event.context).add(ShowVehicleButtonEvent(showVehicleButton ));

emit(state.copyWith(vehicle: vehicle));
});
}

使用BLoC的主要目的是将UI与状态分离。并且有一个全局的、不可变的状态,你可以从任何你想访问的地方访问。UI的目的是触发事件,并让BLoC生成Approvipante状态。若你们试着去听这个事件,你们为什么还要用BLoC呢?在类似您的情况下,您希望为AddUserEvent创建一个专用状态。例如AddUserStateSuccess每当BLoC接收到该事件时,它就会发出相应的状态。你所要做的就是倾听这种状态;(在该状态的侦听器中,您也可以从其他BLoC激发其他事件。

最新更新