我的应用程序越来越复杂,当我需要在事件之后执行代码时,我不知道如何处理事件的等待。现在我只是把事件后需要的代码放在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激发其他事件。