Flutter 如何将这个 BLoC 旧版本代码迁移到 Bloc 新版本

Flutter how to migrate this BLoC old version code to Bloc new version

我必须如何在 bloc v.8 中编写此代码我不知道我如何看到一些搜索但我不明白这是我的代码 类 他们给我错误 => StateError(错误状态: add(DoFetchEvent) 在没有注册事件处理程序的情况下被调用。 确保通过 on((event, emit) {...})):

注册处理程序
 class PostBloc extends Bloc<PostEvent, PostState> {
           PostRepository repo;

        PostBloc(PostState initialState, this.repo) : super(initialState);

      Stream<PostState> mapEventToState(PostEvent event) async* {
           if (event is DoFetchEvent) {
         yield LoadingState();
       try {
      var posts = await repo.fetchPosts();
       yield FetchSuccess(posts: posts);
     } catch (e) {
    yield ErrorState(message: e.toString());
     }
   }
   }
  }

import 'package:equatable/equatable.dart';

 class PostEvent extends Equatable {
 @override
 List<Object?> get props => [];
}

class DoFetchEvent extends PostEvent {}

   class PostState extends Equatable {
       @override
        
      List<Object?> get props => [];
     }

     class InitialState extends PostState {}

     class LoadingState extends PostState {}

       class FetchSuccess extends PostState {
             List<PostModel> posts;

            FetchSuccess({required this.posts});
           }

         class ErrorState extends PostState {
         String message;
      ErrorState({required this.message});
             }

   void main() {
 runApp(MaterialApp(
  home: BlocProvider(
  create: (context) => PostBloc(InitialState(), PostRepository()),
     child: MyApp(),
   ),
 ));
  }

您可以直接在 super 构造函数中设置 InitialState,而无需像这样手动传递它。

 PostBloc(this.repo) : super(InitialState()) {
    on<DoFetchEvent>(_onDoFetchEvent);
  }

那么你在BlocProvider

中的任何状态都不再通过
 BlocProvider<PostBloc>(
          create: (BuildContext context) => PostBloc(PostRepository()),
...

然后你的 mapEventToState 被替换为一个方法,该方法接受相关的 event 和一个 Emitter<PostState> 作为参数。 yield 然后在方法中被替换为 emit

你的整个 class 看起来像这样。

  PostBloc(this.repo) : super(InitialState()) {
    on<DoFetchEvent>(_onDoFetchEvent);
  }

  _onDoFetchEvent(
    DoFetchEvent event,
    Emitter<PostState> emit,
  ) async {
    emit(LoadingState());
    try {
      var posts = await repo.fetchPosts();
      emit(FetchSuccess(posts: posts));
    } catch (e) {
      emit(ErrorState(message: e.toString()));
    }
  }
}

应该可以了。

除此之外,您可能会在您的状态 classes 上收到关于 must_be_immutable 的 linter 警告,因为 PostState 扩展了 Equatable.

所以我建议将所有 PostState 参数设置为 final 并将 props 覆盖从 Equatable 添加到您的状态 classes。

class ErrorState extends PostState {
  final String message;
  ErrorState({required this.message});

  @override
  List<Object?> get props => [message];
}