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

Flutter列表内JSON元素requestAmount修改:重复商品数量累加问题

问题与解决方法

问题背景

我在项目中创建了列表List listArticulosAdd = [];,用于存放HTTPS请求解码得到的JSON对象,示例对象如下:

mapArticuleCode = {
      "articleCode": "HC57533",
      "descriptionOne": "FLAT SCREWDRIVER BOX",
      "descriptionTwo": "FLAT SCREWDRIVER BOX",
      "requestAmount": "1", 
      "unitPrice": "59.99",
      "applyTax": "0.16",
      "um": "PZ",
      "precio": "60.15"
    };

想要实现:当捕获到同一商品(以articleCode为标识)时,累加其requestAmount字段值,而非重复添加到列表中。但尝试以下代码无效果:

if (listArticulosAdd.contains(mapArticuloCode)) {
      setState(() {
        listArticulosAdd.remove(mapArticuloCode);
        int requestAmount =
            int.parse(mapArticuloCode["requestAmount"]);
        requestAmount++;
        mapArticuloCode["requestAmount"] = requestAmount.toString();
        listArticulosAdd.add(mapArticuloCode);
      });
    } else {
      listArticulosAdd.add(mapArticuloCode);
    }

问题原因

Dart中List.contains()方法判断的是对象引用是否完全相同,而你从HTTPS请求解码得到的新商品对象,和列表中已存在的同商品对象是两个不同的引用(即使articleCode相同),所以contains()永远返回false,每次都会执行else分支添加新对象,导致累加逻辑完全没触发。

解决方案

通过articleCode字段查找列表中是否存在对应商品,找到后直接修改其requestAmount,无需移除再添加:

// 先根据articleCode查找列表中的目标商品
final existingItem = listArticulosAdd.firstWhere(
  (item) => item["articleCode"] == mapArticuloCode["articleCode"],
  orElse: () => null,
);

if (existingItem != null) {
  setState(() {
    // 累加requestAmount
    int currentAmount = int.parse(existingItem["requestAmount"]);
    existingItem["requestAmount"] = (currentAmount + 1).toString();
  });
} else {
  setState(() {
    listArticulosAdd.add(mapArticuloCode);
  });
}

补充说明

  • 建议给列表指定泛型类型,提升代码可读性和安全性:List<Map<String, dynamic>> listArticulosAdd = [];
  • 如果你的商品对象可能存在requestAmount不是数字的情况,建议添加异常处理(比如int.tryParse),避免崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:17:07