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

Dart中List的contains方法无法检测列表对象的原因咨询

Dart List.contains 检测对象失效的原因及解决办法

问题根源

Dart 里的 List.contains() 默认靠 == 运算符判断元素是否存在。对于自定义类的对象来说,默认的 == 比的是对象的内存地址,不是内容:

  • 要是两个对象是同一个实例(内存地址一样),contains() 会返回 true
  • 要是内容相同但不是同一个实例,默认 == 会返回 false,自然 contains() 就检测不到了

解决办法

1. 重写自定义类的 == 和 hashCode

想让 contains() 按内容判断,必须给自定义类重写这两个方法:

class User {
  final String id;
  final String name;

  User(this.id, this.name);

  // 重写==,按对象内容比较
  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is User &&
          runtimeType == other.runtimeType &&
          id == other.id &&
          name == other.name;

  // 重写hashCode,和==的逻辑保持一致
  @override
  int get hashCode => id.hashCode ^ name.hashCode;
}

这样哪怕是不同实例,只要 id 和 name 内容一致,contains() 就能正确识别。

2. 用 any() 临时替代(不用改类代码)

要是不想修改类的代码,可以直接用 List.any() 来判断内容:

// 假设list是<User>类型,targetUser是你要检测的对象
if (list.any((user) => user.id == targetUser.id && user.name == targetUser.name)) {
  // 这里写你要执行的逻辑
}

为啥第二张截图里能正常工作?

大概率是因为那张图里,你要检测的对象和列表里的对象是同一个实例——比如是从列表里直接拿出来的,或者引用了同一个变量。这时候默认的 == 比较内存地址会返回 true,contains() 自然就生效了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:20:45