Dart内联与外联调用方法的区别?Bloc两种写法为何表现不同
Bloc中两种事件处理写法的行为差异原因分析
这两种写法的核心差异在于调用state.copyWith时获取的state版本不同,直接导致了状态更新的逻辑差异:
第一种写法的逻辑
on<MyEvent>( (event, emit) async { var datastate = await _productUsecase.getCategories(); emit( state.copyWith( categories: datastate, ), ); }, );
这里会先等待异步请求完成,拿到datastate后再调用state.copyWith。此时的state是事件开始处理瞬间的Bloc状态快照——哪怕在await请求的过程中,Bloc因为其他事件触发了状态更新,这里依然会使用最初的旧状态来生成新状态。
第二种写法的逻辑
on<MyEvent>( (event, emit) async { emit( state.copyWith( categories: await _productUsecase.getCategories(), ), ); }, );
这里的await嵌套在copyWith的参数中,意味着state.copyWith是在异步请求完成后才执行的。此时的state是异步请求结束时的Bloc当前状态——如果在等待数据的过程中,Bloc已经处理了其他事件并更新了状态,这里会使用最新的状态来生成新状态。
差异场景示例
假设在_productUsecase.getCategories()的等待期间,Bloc收到了另一个UpdateFilterEvent,把状态中的filter字段从"all"改成了"electronics":
- 第一种写法最终emit的状态:旧状态的
filter: "all"+ 新的categories数据 - 第二种写法最终emit的状态:最新状态的
filter: "electronics"+ 新的categories数据
只有当该事件处理期间,Bloc没有任何其他状态更新时,两种写法的表现才会一致;一旦存在并发事件或其他状态变更,两者的状态更新结果就会出现明显差异。
内容的提问来源于stack exchange,提问作者Hamid Waezi
相关产品推荐
相关产品推荐

