BlocOverrides.runZoned已废弃,如何用Bloc.observer正确替换?
Bloc
runZoned 废弃后的替代方案 针对Bloc库中BlocOverrides.runZoned方法被废弃的提示,直接通过全局设置BlocObserver的方式替代即可,无需再用runZoned包裹代码逻辑。以下是具体修改步骤:
1. 保留自定义的AppBlocObserver
你的AppBlocObserver实现无需修改,继续保留:
class AppBlocObserver extends BlocObserver { @override void onChange(BlocBase<dynamic> bloc, Change<dynamic> change) { super.onChange(bloc, change); log('onChange(${bloc.runtimeType}, $change)'); } @override void onError(BlocBase<dynamic> bloc, Object error, StackTrace stackTrace) { log('onError(${bloc.runtimeType}, $error, $stackTrace)'); super.onError(bloc, error, stackTrace); } }
2. 修改main函数
移除BlocOverrides.runZoned包裹,直接执行初始化逻辑并全局注册Observer:
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( name: 'tripsy-trip-dps', options: DefaultFirebaseOptions.currentPlatform, ); // 全局设置Bloc观察者 Bloc.observer = AppBlocObserver(); // 调用bootstrap启动应用(替换为你的根Widget构造逻辑) await bootstrap(() => MyApp()); }
3. 修改bootstrap函数
移除BlocOverrides.runZoned,直接在runZonedGuarded内完成Observer设置和应用启动:
Future<void> bootstrap(FutureOr<Widget> Function() builder) async { FlutterError.onError = (details) { log(details.exceptionAsString(), stackTrace: details.stack); }; await runZonedGuarded( () async { // 全局设置Bloc观察者 Bloc.observer = AppBlocObserver(); runApp(await builder()); }, (error, stackTrace) => log(error.toString(), stackTrace: stackTrace), ); }
核心变化说明
- 不再使用
BlocOverrides.runZoned临时覆盖观察者,而是通过Bloc.observer = AppBlocObserver()全局注册,整个应用生命周期内都会生效。 - 这种方式更简洁,符合Bloc v9+的设计规范,完全替代了原
runZoned的功能。
内容的提问来源于stack exchange,提问作者Jarosław Gawlik
相关产品推荐
相关产品推荐

