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
相关产品推荐
相关产品推荐

