You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:05:16