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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:23:50