Flutter Bloc状态类copy方法未保留状态,求排查错误
问题分析与修复
核心错误:未发射新状态
你的Bloc事件处理逻辑里,只创建了新的状态实例,但没通过emit方法把它发送出去。Flutter Bloc的状态是不可变的,必须调用emit通知框架状态更新,否则原state会一直保持不变,这就是你看到transferAccountDetails始终为null的原因。
修复步骤
修改事件处理代码,添加
emit调用
把创建新状态的代码用emit包裹,让Bloc更新状态:on<AddAccountEvent>((AddAccountEvent event, Emitter<FondoFormState> emit) { print(event.transferAccountDetails); // 创建新状态并发射 final newState = FondoFormState.copy(state, transferAccountDetails: event.transferAccountDetails); emit(newState); // 打印新状态而非原状态 print(newState); });注意:要打印新创建的
newState,而不是原state——原state要在emit之后才会被Bloc替换成新状态。(可选)优化状态类的复制方法命名
你的copy构造函数逻辑是对的,但Flutter社区更常用copyWith作为状态复制方法的命名,可读性更强:class FondoFormState extends Equatable { const FondoFormState({ this.transferAccountDetails, }); // 重命名为copyWith FondoFormState copyWith({ List<TransferAccountDetails>? transferAccountDetails, }) { return FondoFormState( transferAccountDetails: transferAccountDetails ?? this.transferAccountDetails, ); } final List<TransferAccountDetails>? transferAccountDetails; @override List<Object?> get props => <Object?>[transferAccountDetails]; @override bool get stringify => true; }对应的事件处理代码也会更简洁:
final newState = state.copyWith(transferAccountDetails: event.transferAccountDetails); emit(newState);
验证修复
修改后重新运行代码,触发AddAccountEvent后,Bloc会正确更新状态,transferAccountDetails将不再为null,UI也会响应状态变化。
内容的提问来源于stack exchange,提问作者flutter
相关产品推荐
相关产品推荐

