如何解决Bloc中LoadFavoriteMovieEvent无注册事件处理器的错误?
修复Bloc事件处理器未注册的错误
你碰到的这个错误是因为Bloc 8.0及以上版本已经废弃了mapEventToState方法,现在必须用on<Event>的方式注册事件处理器,你的代码还在沿用旧的写法,导致框架找不到LoadFavoriteMovieEvent的处理逻辑。
直接把代码改成新版Bloc的写法就行,以下是修复后的完整代码:
class FavoriteBloc extends Bloc<FavoriteEvent, FavoriteState> { final SaveMovie saveMovie; final GetFavoriteMovies getFavoriteMovies; final DeleteFavoriteMovie deleteFavoriteMovie; final CheckIfFavoriteMovie checkIfFavoriteMovie; FavoriteBloc({ required this.saveMovie, required this.getFavoriteMovies, required this.deleteFavoriteMovie, required this.checkIfFavoriteMovie, }) : super(FavoriteInitial()) { // 注册ToggleFavoriteMovieEvent处理器 on<ToggleFavoriteMovieEvent>((event, emit) async { if (event.isFavorite) { await deleteFavoriteMovie(MovieParams(event.movieEntity.id)); } else { await saveMovie(event.movieEntity); } final response = await checkIfFavoriteMovie(MovieParams(event.movieEntity.id)); response.fold( (l) => emit(FavoriteMoviesError()), (r) => emit(IsFavoriteMovie(r)), ); }); // 注册LoadFavoriteMovieEvent处理器 on<LoadFavoriteMovieEvent>((event, emit) async* { yield* _fetchLoadFavoriteMovies(emit); }); // 注册DeleteFavoriteMovieEvent处理器 on<DeleteFavoriteMovieEvent>((event, emit) async* { await deleteFavoriteMovie(MovieParams(event.movieId)); yield* _fetchLoadFavoriteMovies(emit); }); // 注册CheckIfFavoriteMovieEvent处理器 on<CheckIfFavoriteMovieEvent>((event, emit) async { final response = await checkIfFavoriteMovie(MovieParams(event.movieId)); response.fold( (l) => emit(FavoriteMoviesError()), (r) => emit(IsFavoriteMovie(r)), ); }); } // 补充原来的加载逻辑方法,调整为接收emit参数 Stream<FavoriteState> _fetchLoadFavoriteMovies(Emitter<FavoriteState> emit) async* { final response = await getFavoriteMovies(); yield response.fold( (l) => FavoriteMoviesError(), (r) => FavoriteMoviesLoaded(r), ); } }
关键修改点:
- 移除了重写的
mapEventToState方法 - 在Bloc构造函数内部,用
on<具体事件类型>的方式逐个注册事件处理器 - 原来的
yield逻辑替换为emit调用(异步生成器场景可保留yield*,需传递emit参数) - 确保所有事件都有对应的
on<Event>注册,包括报错的LoadFavoriteMovieEvent
内容的提问来源于stack exchange,提问作者junior
相关产品推荐
相关产品推荐

