如何将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
相关产品推荐
相关产品推荐

