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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:45:39