Flutter同一Bloc管理多状态时更新丢失原有属性该如何解决
Flutter Bloc多状态更新属性丢失问题解决方案
问题根因
- 你当前的
ProductsState是抽象基类,没有定义统一的copyWith方法,处理OnTercero事件时直接创建全新的ProductsTercero实例,没有继承之前已存在的ProductsTercero状态的属性值,因此numero属性回退到默认值0。 - 你尝试的
ProductsTercero().copyWith(msg: 'New msg')写法是先创建了一个全新的默认ProductsTercero对象(默认numero为0)再执行copy操作,自然无法保留之前的数值6。
正确实现方案
只需要修改OnTercero事件的处理逻辑,先将当前状态强转为ProductsTercero类型,再调用它自身的copyWith方法修改需要更新的属性,其余原有属性会自动保留:
on<OnTercero>((event, emit) { // 先校验当前状态是否为ProductsTercero类型 if (state is ProductsTercero) { // 调用当前状态实例的copyWith方法,仅修改msg属性,保留原有numero值 emit(state.copywith(msg: 'New msg')); } else { // 若当前不是ProductsTercero状态,再按需初始化新实例 emit(ProductsTercero(msg: 'New msg')); } });
注意:上述代码中的
copywith方法名要和你在状态类中定义的小写名称保持一致,如果后续统一改成驼峰命名copyWith同步修改即可。
可选优化方案
如果多个子状态都包含相同的msg、numero属性,可以将这两个属性和copyWith接口定义到抽象基类ProductsState中,后续处理事件时就不需要重复做类型判断,直接调用基类的copyWith方法即可。
内容的提问来源于stack exchange,提问作者Dubbain
相关产品推荐
相关产品推荐

