flutter_bloc从0.6版本迁移至6.1.1版本的报错解决求助
flutter_bloc 0.6 版本迁移至 6.1.1 版本实操指引
核心报错修复指引
- 报错:
TabsBloc上未定义dispatch方法
6.x 版本已将原事件触发接口更名,将所有Bloc实例的dispatch(事件)调用替换为add(事件)即可。例如原代码tabsBloc.dispatch(RefreshTabsEvent()),修改为tabsBloc.add(RefreshTabsEvent())。 - 报错:父类
Bloc<ThemeEvent, ThemeState>不存在无参构造函数
6.x 版本强制要求Bloc初始化时传入初始状态,不再支持无参构造的Bloc子类。需在自定义Bloc的构造函数中,通过super传入定义好的初始State实例,示例写法:class ThemeBloc extends Bloc<ThemeEvent, ThemeState> { // 传入对应初始状态,替代原无参构造 ThemeBloc() : super(ThemeInitialState()); } - 报错:未定义命名参数
builder
6.x 版本调整了BlocProvider的注入参数命名,原builder参数已更名为create。全局搜索所有BlocProvider、MultiBlocProvider嵌套列表中的builder:配置项,全部替换为create:即可。例如原代码BlocProvider(builder: (context) => ThemeBloc()),修改为BlocProvider(create: (context) => ThemeBloc())。 - 报错:
ThemeBloc上未定义dispose方法
6.x 版本的Bloc已内置完整生命周期管理逻辑,会在对应Widget从组件树移除时自动释放资源,不再需要手动调用dispose方法。直接删除所有手动触发Bloc的dispose调用代码、以及自定义Bloc类中重写的dispose方法即可。
全量迁移操作步骤
- 全局搜索替换项目内所有Bloc实例的
dispatch(调用为add(,覆盖所有事件触发场景 - 为所有自定义Bloc类的构造函数补充
super参数,传入对应State体系下的初始状态实例 - 全局替换所有BlocProvider类的
builder:命名参数为create: - 移除所有手动调用Bloc
dispose、以及Bloc类内重写dispose的相关代码 - 调整原Bloc类中重写的
mapEventToState逻辑:6.1.1版本需将事件处理逻辑改为在构造函数内通过on<具体事件类型>((event, emit) { ... })的方式注册,使用emit方法发射新状态,替代原版本中yield返回状态流的写法。
内容的提问来源于stack exchange,提问作者Alberto Acuña
相关产品推荐
相关产品推荐

