flutter_bloc调用transform报错超类未定义,求新版适配实现代码
问题原因
flutter_bloc v8.0+ 版本已移除旧版中支持重写的全局transform方法,所有事件流转换逻辑均需调整为在事件注册的on<E>方法中通过transformer参数配置实现。
适配新版的完整实现代码
import 'package:rxdart/rxdart.dart'; import 'package:bloc/bloc.dart'; // 示例基础事件定义,可替换为你自己的原有定义 abstract class SearchEvent {} class LoadSearchRestaurantEvent extends SearchEvent { final String searchKeyword; const LoadSearchRestaurantEvent(this.searchKeyword); } // 示例基础状态定义,可替换为你自己的原有定义 abstract class SearchState {} class LoadedAllRestaurantState extends SearchState { final List<dynamic> restaurantList; const LoadedAllRestaurantState(this.restaurantList); } class SearchBloc extends Bloc<SearchEvent, SearchState> { final SearchRestaurantDataService searchRestaurantDataService; SearchBloc({required this.searchRestaurantDataService}) : super(/* 填入你的初始状态 */) { // 注册搜索事件,配置防抖transformer on<LoadSearchRestaurantEvent>( (event, emit) async { // 这里写你的原有业务逻辑:调用搜索接口、返回对应状态即可 final result = await searchRestaurantDataService.search(event.searchKeyword); emit(LoadedAllRestaurantState(result)); }, // 这里配置防抖逻辑,和旧版功能完全一致 transformer: (events, mapper) => events .debounceTime(const Duration(milliseconds: 1000)) .switchMap(mapper), ); } }
说明
- 无需再重写父类不存在的
transform方法,所有流处理逻辑都聚合在对应事件的注册配置中,职责更清晰 - 不需要手动将事件流强转为
PublishSubject,直接通过rxdart操作符处理流即可 - 示例中使用
switchMap可避免旧请求还没返回就发起新请求导致的状态错乱问题,更符合搜索场景的使用需求
内容的提问来源于stack exchange,提问作者Mohammed Nabil
相关产品推荐
相关产品推荐

