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

Dart/Flutter中List.contains判断自定义对象返回false问题

问题原因

List.contains返回false的核心原因来自Dart的默认相等判断规则:

  • List.contains的判断逻辑是遍历列表内元素,逐个通过==运算符和传入参数做相等比较,匹配到相等元素就返回true,遍历完无匹配则返回false。
  • 对于没有手动重写==运算符和hashCode的自定义类(比如你的AnimeModel),默认继承自Object的==仅判断两个对象是否为内存中同一个引用的实例,不会比对对象内部的属性值是否一致。
  • 哪怕两个AnimeModel实例的id、name、image属性完全相同,只要是分别创建的不同内存实例,默认==比较结果就是false,contains自然会返回false。

注:如果你传入contains的就是当初add进列表的同一个变量指向的实例,默认逻辑下会返回true,返回false说明你传入的是属性相同但重新创建的新实例。

修复方式

两种常用方案可以解决这个问题:

  • 手动重写AnimeModel的==运算符和hashCode,让相等判断基于业务属性值而非引用地址,参考代码:
class AnimeModel {
  final String id;
  final String name;
  final String image;

  AnimeModel({required this.id, required this.name, required this.image});

  @override
  bool operator ==(Object other) {
    // 同一引用直接返回true
    if (identical(this, other)) return true;
    // 类型匹配后比对所有业务属性
    return other is AnimeModel &&
        runtimeType == other.runtimeType &&
        other.id == id &&
        other.name == name &&
        other.image == image;
  }

  @override
  int get hashCode => Object.hash(id, name, image);
}
  • 借助工具库减少手写模板代码,比如equatable、freezed,这类库会自动生成符合要求的==和hashCode逻辑,只需要让类继承对应的基类或者添加注解即可,不需要手动编写判断逻辑。

内容的提问来源于stack exchange,提问作者Mohamed Shaheen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:45:35