Dart中判断列表是否包含对象属性及列表更新问题排查
问题排查与修正方案
咱们一步步拆解你的代码为啥没按预期运行,然后给出修复方案:
核心问题分析
你的代码有两个关键问题导致逻辑失效:
1. contains() 方法使用错误
myItemsList 是 List<MyItem> 类型的列表,默认的 contains() 方法是用来判断列表中是否包含某个MyItem对象(默认比较对象引用,除非你重写了==运算符)。但你传入的是 myitem.itemId(String类型),类型完全不匹配,所以这个判断永远会返回false,导致每次都会执行else分支添加新对象,完全不会触发“已存在”的逻辑。
2. 缺失“增加itemQuantity”的核心逻辑
即使你的存在判断是正确的,当前的if分支也只是打印了一句话,没有实现找到对应item后增加数量的核心需求。
修正后的完整代码
List<MyItem> myItemsList = []; // Dart 2.2+推荐用空列表初始化,替代new List() MyItem myitem = MyItem(itemId: id, itemName: name, itemQuantity: qty); // 查找列表中是否存在itemId匹配的MyItem final existingItemIndex = myItemsList.indexWhere((item) => item.itemId == myitem.itemId); if (existingItemIndex != -1) { // 存在:增加对应item的数量 print('Already exists! Increasing quantity...'); setState(() { // 如果你是要累加传入的qty就用下面这句,要是只加1就改成 +=1 myItemsList[existingItemIndex].itemQuantity += myitem.itemQuantity; }); } else { // 不存在:添加新对象 print('Added!'); setState(() { myItemsList.add(myitem); }); } // 空安全环境下推荐给构造函数参数加required修饰符 class MyItem { final String itemId; final String itemName; int itemQuantity; MyItem({required this.itemId, required this.itemName, required this.itemQuantity}); }
关键逻辑说明
- 用
indexWhere()遍历列表,通过item.itemId == myitem.itemId的条件查找匹配元素的索引:找到则返回索引值,没找到返回-1。 - 如果找到匹配元素,直接修改该元素的
itemQuantity(因为它不是final属性,所以可以修改),然后调用setState()更新UI。 - 如果没找到,就把新的
myitem添加到列表中。
另外,如果你使用的是Dart空安全版本,给MyItem的构造函数参数加上required修饰符,可以避免空值相关的潜在问题。
内容的提问来源于stack exchange,提问作者Kavin-K
相关产品推荐
相关产品推荐

