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

如何在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:50:33