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

