如何在flutter_bloc的on<Event>方法中匹配多个或关系事件实现逻辑复用?
flutter_bloc多事件复用同一处理逻辑的实现方法
你期望的on<LoadPostsEvent || PullToRefreshEvent>是Dart泛型不支持的语法,可通过以下两种官方推荐的方式实现需求:
方案1:基于事件继承实现(推荐)
flutter_bloc的on<E>方法本身支持匹配E的所有子类事件,你可以先定义一个抽象的父类事件,让需要复用逻辑的两个事件都继承该父类:
// 先定义抽象父类事件,继承自你原本的PostsEvent abstract class BaseFetchPostsEvent extends PostsEvent {} // 原有加载事件继承父类 class LoadPostsEvent extends BaseFetchPostsEvent {} // 新增下拉刷新事件也继承同一个父类 class PullToRefreshEvent extends BaseFetchPostsEvent {}
Bloc内的注册写法:
class PostsBloc extends Bloc<PostsEvent, PostsState> { final _dataService = DataService(); PostsBloc() : super(LoadingPostsState()) { // 监听父类事件,两个子类事件都会触发该回调 on<BaseFetchPostsEvent>((event, emit) async { // 只有LoadPostsEvent触发时才发送加载状态 if (event is LoadPostsEvent) { emit(LoadingPostsState()); } try { final posts = await _dataService.getPosts(); emit(LoadedPostsState(posts: posts)); } catch (e) { emit(FailedToLoadPostsState(error: e)); } }); } }
方案2:抽取公共逻辑分别注册
如果不想修改现有事件的继承结构,可以直接把公共逻辑抽成独立方法,分别给两个事件注册监听:
class PostsBloc extends Bloc<PostsEvent, PostsState> { final _dataService = DataService(); PostsBloc() : super(LoadingPostsState()) { on<LoadPostsEvent>(_handleFetchPosts); on<PullToRefreshEvent>(_handleFetchPosts); } // 公共处理方法,参数为父类PostsEvent类型 Future<void> _handleFetchPosts(PostsEvent event, Emitter<PostsState> emit) async { if (event is LoadPostsEvent) { emit(LoadingPostsState()); } try { final posts = await _dataService.getPosts(); emit(LoadedPostsState(posts: posts)); } catch (e) { emit(FailedToLoadPostsState(error: e)); } } }
两种方案效果完全一致,方案1适合事件逻辑关联度高、后续可能新增同类事件的场景,方案2不需要调整原有事件定义,改造成本更低。
内容的提问来源于stack exchange,提问作者rebix
相关产品推荐
相关产品推荐

