You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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官方示例逻辑完全对齐,遵循不可变状态更新原则,每一层嵌套结构都做「匹配则返回修改后的新对象,不匹配则返回原有对象」的处理,不会额外新增任何冗余条目:

  1. 最外层遍历所有商品,非目标商品直接复用原有对象,避免不必要的对象创建
  2. 命中目标商品后,遍历该商品下的所有服务,非目标服务直接复用原有对象
  3. 命中目标服务后,仅返回count减1的新服务对象替换原有服务,其余数据完全不变

内容的提问来源于stack exchange,提问作者DolDurma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:57:03