Flutter Bloc报错:未注册LoadFavoriteMovieEvent处理程序求解决
错误原因
错误提示明确指出LoadFavoriteMovieEvent未通过on((event, emit) {...})注册事件处理器。你的代码中,ToggleFavoriteMovieEvent和CheckIfFavoriteMovieEvent使用了Bloc的新事件注册API(on<Event>),但LoadFavoriteMovieEvent和DeleteFavoriteMovieEvent仍放在已废弃的mapEventToState方法中处理——Bloc v8+版本不再自动识别该方法内的事件逻辑,因此触发事件时找不到对应处理器。
解决方案
将LoadFavoriteMovieEvent和DeleteFavoriteMovieEvent的处理逻辑迁移到Bloc构造函数内,用on<Event>方式注册处理器,同时移除废弃的mapEventToState方法。修改后的完整代码如下:
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()) { 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), ); emit(response.fold( (l) => FavoriteMoviesError(), (r) => IsFavoriteMovie(r), )); }); on<CheckIfFavoriteMovieEvent>((event, emit) async { final response = await checkIfFavoriteMovie( MovieParams(event.movieId), ); emit(response.fold( (l) => FavoriteMoviesError(), (r) => IsFavoriteMovie(r), )); }); // 注册LoadFavoriteMovieEvent处理器 on<LoadFavoriteMovieEvent>((event, emit) async { final Either<AppError, List<MovieEntity>> response = await getFavoriteMovies(NoParams()); emit(response.fold( (l) => FavoriteMoviesError(), (r) => FavoriteMoviesLoaded(r), )); }); // 注册DeleteFavoriteMovieEvent处理器 on<DeleteFavoriteMovieEvent>((event, emit) async { await deleteFavoriteMovie(MovieParams(event.movieId)); // 重新加载收藏列表 final Either<AppError, List<MovieEntity>> response = await getFavoriteMovies(NoParams()); emit(response.fold( (l) => FavoriteMoviesError(), (r) => FavoriteMoviesLoaded(r), )); }); } }
优化建议
如果想复用加载收藏列表的逻辑,可以封装为私有方法,简化代码:
// 在FavoriteBloc类内添加私有方法 Future<void> _loadFavoriteMovies(Emitter<FavoriteState> emit) async { final Either<AppError, List<MovieEntity>> response = await getFavoriteMovies(NoParams()); emit(response.fold( (l) => FavoriteMoviesError(), (r) => FavoriteMoviesLoaded(r), )); }
然后修改对应的事件处理器:
on<LoadFavoriteMovieEvent>((event, emit) => _loadFavoriteMovies(emit)); on<DeleteFavoriteMovieEvent>((event, emit) async { await deleteFavoriteMovie(MovieParams(event.movieId)); await _loadFavoriteMovies(emit); });
内容的提问来源于stack exchange,提问作者junior
相关产品推荐
相关产品推荐

