Flutter升级BLoC 8.0.0后transformEvents废弃报错如何解决?
Bloc 8.0 transformEvents废弃问题修复方案
问题背景
Bloc 8.0版本对事件处理机制做了重构,全局重写transformEvents统一处理事件流的方式已被官方废弃,要求在单个事件的注册逻辑中通过EventTransformer实现流控制,你遇到的报错如下:
'transformEvents' is deprecated and shouldn't be used. Use
on<Event>with anEventTransformerinstead. Will be removed in v8.0.0.
修复步骤
1. 旧代码示例(已废弃写法)
旧版本中通常重写transformEvents实现搜索防抖、事件去重、并发控制等逻辑,写法如下:
class SearchBloc extends Bloc<SearchEvent, SearchState> { SearchBloc() : super(SearchInitial()) { on<SearchQueryChanged>(_handleSearch); } // 废弃的全局事件流处理逻辑 @override Stream<Transition<SearchEvent, SearchState>> transformEvents( Stream<SearchEvent> events, Stream<Transition<SearchEvent, SearchState>> Function(SearchEvent) transitionFn, ) { // 给搜索事件加300ms防抖 return events .whereType<SearchQueryChanged>() .debounceTime(const Duration(milliseconds: 300)) .flatMap(transitionFn); } Future<void> _handleSearch( SearchQueryChanged event, Emitter<SearchState> emit, ) async { // 原有搜索业务逻辑 } }
2. 新版本兼容写法
删除重写的transformEvents方法,把流控制逻辑直接传入对应事件on方法的transformer参数即可:
import 'package:bloc/bloc.dart'; // 如需使用官方预置的并发控制转换器,可引入bloc_concurrency包 import 'package:bloc_concurrency/bloc_concurrency.dart'; class SearchBloc extends Bloc<SearchEvent, SearchState> { SearchBloc() : super(SearchInitial()) { on<SearchQueryChanged>( _handleSearch, // 在此处指定当前事件的流转换器 transformer: (events, mapper) => events .debounceTime(const Duration(milliseconds: 300)) .flatMap(mapper), // 也可直接使用bloc_concurrency预置的通用转换器: // transformer: restartable(), 每次新事件触发时取消上一次未完成的处理逻辑,适合搜索场景 // transformer: droppable(), 前一个事件处理完成前丢弃新触发的事件 // transformer: sequential(), 按事件触发顺序串行处理,为默认行为 ); } // 原有业务处理逻辑无需修改 Future<void> _handleSearch( SearchQueryChanged event, Emitter<SearchState> emit, ) async { // 原有搜索业务逻辑 } }
注意事项
- 如果多个事件需要使用相同的流处理逻辑,可以把transformer抽成公共全局变量,复用逻辑减少重复代码
- 无需特殊流控制的事件不需要额外指定transformer参数,默认行为和旧版本一致
- 自定义transformer的逻辑和原来
transformEvents的流处理逻辑完全一致,可直接把旧代码中对应事件的流处理逻辑迁移过来
内容的提问来源于stack exchange,提问作者fplopez
相关产品推荐
相关产品推荐

