You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:08:30