Flutter Bloc调用LoadMissionsEvent提示未注册事件处理器报错求助
问题原因
这个是Bloc 8.0及以上版本的常见报错,原因是你创建的SwipeBloc没有为调用的LoadMissionsEvent注册对应的事件处理逻辑,Bloc要求所有发送的事件都必须提前通过on<事件类型>((event, emit) {...})方法注册处理函数。
解决步骤
- 第一步:检查你的
SwipeBloc实现,在构造函数中注册所有需要用到的事件处理逻辑,示例代码如下:
abstract class SwipeState {} class SwipeInitial extends SwipeState {} class MissionsLoaded extends SwipeState { final List<MissionDescription> missions; MissionsLoaded({required this.missions}); } class SwipeBloc extends Bloc<SwipeEvent, SwipeState> { SwipeBloc() : super(SwipeInitial()) { // 必须在此处注册所有用到的事件的处理逻辑 on<LoadMissionsEvent>(_onLoadMissions); // 后续其他事件(比如滑动卡片事件)也要在此处注册 // on<SwipeCardEvent>(_onSwipeCard); } // LoadMissionsEvent对应的处理逻辑 void _onLoadMissions(LoadMissionsEvent event, Emitter<SwipeState> emit) { // 此处编写你的业务逻辑,处理完成后抛出对应状态即可 emit(MissionsLoaded(missions: event.missionDescriptions)); } }
- 第二步:确认事件类的继承关系正确,
LoadMissionsEvent必须继承自SwipeBloc对应的事件父类:
abstract class SwipeEvent {} class LoadMissionsEvent extends SwipeEvent { final List<MissionDescription> missionDescriptions; const LoadMissionsEvent({required this.missionDescriptions}); }
- 第三步:排查容易写错的细节
- 注册事件时不要漏掉泛型声明,必须写
on<LoadMissionsEvent>(...),不能只写on(...) - 不要使用已经废弃的
mapEventToState方法处理事件,Bloc 8.0+已经不再支持该写法
- 注册事件时不要漏掉泛型声明,必须写
补充说明
你当前的项目入口初始化代码没有问题,在BlocProvider的create方法中初始化Bloc后直接调用add方法发送初始化事件是合理写法,不需要调整这部分逻辑。
内容的提问来源于stack exchange,提问作者Yanis Belazzoug
相关产品推荐
相关产品推荐

