Flutter Riverpod更新嵌套存储状态时新增而非修改数据如何解决
错误原因
- 第一层构建商品列表时先执行了
...state.products把原有所有商品全部保留,后续遍历生成的修改后商品会直接追加到列表末尾,导致商品重复、新旧数据共存 - 匹配到目标服务时,先保留了原有同id的服务,再追加修改count后的新服务,导致同一个服务出现两个条目
- 遍历商品下的服务时,每个服务都会生成一遍新的
SelectedProducts对象,导致同一个商品重复生成多次
正确实现代码
void decrement(int productId, int serviceId) { state = OrderStructure( state.title, // 遍历所有商品生成新列表,不直接保留原有全部商品 [ for (final product in state.products) // 商品id不匹配直接返回原商品对象 if (product.id != productId) product // 商品id匹配,遍历该商品下的所有服务生成新服务列表 else SelectedProducts( product.id, [ for (final service in product.services) // 服务id不匹配直接返回原服务对象 if (service.id != serviceId) service // 服务id匹配,返回count减1的新服务对象替换旧服务 else SelectedProductServices( service.id, service.count - 1, service.cost, ), ], ) ], ); }
逻辑说明
和Riverpod官方示例逻辑完全对齐,遵循不可变状态更新原则,每一层嵌套结构都做「匹配则返回修改后的新对象,不匹配则返回原有对象」的处理,不会额外新增任何冗余条目:
- 最外层遍历所有商品,非目标商品直接复用原有对象,避免不必要的对象创建
- 命中目标商品后,遍历该商品下的所有服务,非目标服务直接复用原有对象
- 命中目标服务后,仅返回count减1的新服务对象替换原有服务,其余数据完全不变
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

