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

Flutter Freezed自定义==运算符异常:identical判断列表返回false

问题分析与解决

1. identical函数的本质

identical(a, b)的作用是判断两个对象是否为内存中的同一个实例,即它们的引用地址完全一致。这和你重写的==运算符(用于判断值相等)是完全不同的逻辑:

  • 哪怕两个列表里的所有元素值完全相等,只要它们是两个独立创建的列表实例(比如一个是新生成的、一个是复制的、或是从接口重新获取的),identical都会返回false。
  • 你用identical比较两个列表,本质是在问“这两个列表是不是同一个对象”,而非“这两个列表的内容是否一致”。

2. 你的==运算符重写存在错误

你在重写==时额外添加了identical(other, this)条件,这会导致:即使两个ServiceItemModel的所有字段(id、product.id等)完全匹配,只要它们不是同一个实例,==就会返回false——这完全违背了重写==来判断值相等的初衷。

另外,Freezed库本身会自动为生成的类实现正确的==和hashCode逻辑,完全不需要手动重写,手动修改反而容易引入错误。

3. 正确的处理方式

  • 判断列表内容是否相等:直接使用列表的==运算符,即bool iseq = servicesItem == oldService;。但要确保列表中ServiceItemModel的==逻辑正确——要么删掉你手动重写的==让Freezed自动生成,要么修复重写的==(去掉identical(other, this)条件)。
  • 判断列表是否为同一个实例:才需要用identical,但这种场景在业务中很少见,大部分时候我们关心的是内容是否匹配。

若坚持手动重写==,修复后的代码应为:

@override
bool operator ==(Object other) =>
    other is _ServiceItemModel &&
    id == other.id &&
    product.id == other.product.id &&
    product.externalId == other.product.externalId &&
    internalId == other.internalId;

内容的提问来源于stack exchange,提问作者Cyrus the Great

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:26