如何在Dart CLI中运行BlocObserver示例?
Dart CLI中BlocObserver回调不触发的问题解决
问题描述
在Dart CLI环境测试BlocObserver时,编写的onCreate、onEvent、onChange等回调方法完全无法触发。原代码逻辑为先创建Bloc实例,再设置Bloc.observer。
错误原因
Bloc的生命周期回调(如onCreate)是在Bloc实例初始化的瞬间触发的。如果先实例化Bloc再绑定观察者,此时实例已经创建完成,后续的事件、状态变更等操作也无法被后绑定的观察者捕获。
解决方案
调整代码执行顺序,必须在创建任何Bloc/Cubit实例之前,先完成Bloc.observer的设置。
修正后的完整代码
import 'package:bloc/bloc.dart'; void main(){ // 先绑定观察者,再创建Bloc实例 Bloc.observer = MyBlocObserver(); MyBloc myBloc = MyBloc(); myBloc.add(NewEvent(eventName: "Test")); } class MyBlocObserver extends BlocObserver { @override void onChange(BlocBase bloc, Change change) { print("onChange"); super.onChange(bloc, change); } @override void onCreate(BlocBase bloc) { print("onCreate"); super.onCreate(bloc); } @override void onClose(BlocBase bloc) { print("onClose"); super.onClose(bloc); } @override void onError(BlocBase bloc, Object error, StackTrace stackTrace) { print("onError"); super.onError(bloc, error, stackTrace); } @override void onEvent(Bloc bloc, Object? event) { print("onEvent"); super.onEvent(bloc, event); } } // 补充原代码缺失的Bloc与Event定义,确保代码可运行 class NewEvent { final String eventName; NewEvent({required this.eventName}); } class MyBloc extends Bloc<NewEvent, String> { MyBloc() : super("initial state") { on<NewEvent>((event, emit) { emit(event.eventName); }); } }
效果说明
修正后,Bloc.observer在Bloc实例创建前完成绑定,此时:
onCreate会在MyBloc实例化时立即触发onEvent会在调用myBloc.add(NewEvent)时触发onChange会在状态变更时触发
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

