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

如何将Bloc 7的网络连接检查代码迁移适配到Bloc 8版本

Bloc 7 网络检查Bloc迁移至Bloc 8适配方案

核心语法差异说明

Bloc 8 移除了旧版本的mapEventToState事件处理机制,所有事件逻辑需要在构造函数内通过on<Event>方法注册,状态输出统一使用事件回调提供的emit方法,不再支持async* + yield的状态返回写法。

改造后可直接运行的代码

原有事件、状态类(NetworkEvent、NetworkState、ConnectionInitial、ListenConnection、ConnectionChanged、ConnectionFailure、ConnectionSuccess)无需修改,仅调整Bloc核心实现即可:

class NetworkBloc extends Bloc<NetworkEvent, NetworkState> {
  NetworkBloc() : super(ConnectionInitial()) {
    // 注册两类事件的处理逻辑
    on<ListenConnection>(_handleListenConnection);
    on<ConnectionChanged>(_handleConnectionChanged);
  }

  StreamSubscription? _connectionSub;

  /// 处理启动连接监听的事件
  Future<void> _handleListenConnection(
    ListenConnection event,
    Emitter<NetworkState> emit,
  ) async {
    // 重复触发监听前先取消旧订阅,避免多监听重复回调
    await _connectionSub?.cancel();
    _connectionSub = DataConnectionChecker().onStatusChange.listen((status) {
      add(ConnectionChanged(
        status == DataConnectionStatus.disconnected
            ? ConnectionFailure()
            : ConnectionSuccess()
      ));
    });
  }

  /// 处理连接状态变更事件
  void _handleConnectionChanged(
    ConnectionChanged event,
    Emitter<NetworkState> emit,
  ) {
    // 用emit输出新状态,替换旧版本的yield
    emit(event.connection);
  }

  @override
  Future<void> close() {
    // Bloc销毁时取消订阅释放资源
    _connectionSub?.cancel();
    return super.close();
  }
}

更简洁的官方推荐写法

如果不需要手动控制订阅生命周期,可以直接用Bloc内置的emit.forEachAPI托管流订阅,Bloc会自动在Bloc销毁、重复注册监听时取消订阅,无需手动管理订阅对象和重写close方法,代码量更少:

class NetworkBloc extends Bloc<NetworkEvent, NetworkState> {
  NetworkBloc() : super(ConnectionInitial()) {
    on<ListenConnection>(_handleListenConnection);
    on<ConnectionChanged>((event, emit) => emit(event.connection));
  }

  Future<void> _handleListenConnection(
    ListenConnection event,
    Emitter<NetworkState> emit,
  ) async {
    await emit.forEach<DataConnectionStatus>(
      DataConnectionChecker().onStatusChange,
      onData: (status) => status == DataConnectionStatus.disconnected
          ? ConnectionFailure()
          : ConnectionSuccess(),
    );
  }
}

注意事项

  • 不要在事件处理函数作用域外调用emit方法,会触发Bloc状态异常
  • 如果使用空安全版本的DataConnectionChecker,注意核对导包路径和类名不要写错
  • 如果业务逻辑中存在其他地方主动触发ConnectionChanged事件的场景,保留该事件的注册逻辑即可;如果仅由网络状态监听触发状态变更,甚至可以删掉ConnectionChanged事件,直接在流监听回调里emit对应状态,进一步精简代码

内容的提问来源于stack exchange,提问作者mr. m0hmam4d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:01:10