Flutter中event.map场景下emit调用报错:事件处理完成后调用emit
问题修复:Flutter Bloc中event.map分支二次emit触发_AssertionError
问题原因
你遇到的断言错误,本质是事件处理器函数提前结束,后续异步操作完成后调用emit时,发射器已失效。具体来说,eventHandler虽标记为async,但调用event.map时未等待firstEvent分支的异步逻辑执行完毕,导致eventHandler在Future.delayed完成前就已退出,此时再调用emit就会触发错误。
修复方案
方案一:等待event.map的异步分支执行完成
修改eventHandler函数,在event.map前添加await,同时统一map各分支的返回值类型:
FutureOr<void> eventHandler( SampleEvent event, Emitter<SampleState> emit, ) async { // 等待map中所有分支的逻辑执行完成 await event.map( firstEvent: (value) async { emit(const SampleState.firstState()); await Future.delayed(const Duration(seconds: 2)); emit(const SampleState.secondState()); }, secondEvent: (value) => Future.value(), // 让分支返回Future,保持类型一致 ); }
方案二:为每个事件单独注册处理器(推荐)
这是Bloc官方推荐的写法,每个事件对应独立的处理函数,避免统一处理器带来的异步等待问题,逻辑更清晰:
class SampleBloc extends Bloc<SampleEvent, SampleState> { SampleBloc() : super(const SampleState.initialState()) { // 为每个事件单独绑定处理函数 on<FirstEvent>(_handleFirstEvent); on<SecondEvent>(_handleSecondEvent); } Future<void> _handleFirstEvent( FirstEvent event, Emitter<SampleState> emit, ) async { emit(const SampleState.firstState()); await Future.delayed(const Duration(seconds: 2)); emit(const SampleState.secondState()); } void _handleSecondEvent(SecondEvent event, Emitter<SampleState> emit) {} }
说明
方案二不仅解决了当前的异步等待问题,还让代码结构更清晰,便于后续维护和扩展,更符合Bloc的设计规范。
内容的提问来源于stack exchange,提问作者Piotr Temp
相关产品推荐
相关产品推荐

