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

