const_map_key_not_primitive_equality
常量 map 中键的类型不能覆写 '==' 运算符或 'hashCode',但类 '{0}' 做到了。
描述
#当用作常量 map 字面量中键的对象的类实现了 ==
运算符、hashCode
getter 或两者时,分析器会产生此诊断。常量 map 的实现同时使用了 ==
运算符和 hashCode
getter,因此除了继承自 Object
的实现之外的任何实现都需要在编译时执行任意代码,而这是不受支持的。
示例
#以下代码会产生此诊断,因为该常量 map 包含一个类型为 C
的键,并且类 C
覆写了 ==
的实现
dart
class C {
const C();
bool operator ==(Object other) => true;
}
const map = {C() : 0};
以下代码会产生此诊断,因为该常量 map 包含一个类型为 C
的键,并且类 C
覆写了 hashCode
的实现
dart
class C {
const C();
int get hashCode => 3;
}
const map = {C() : 0};
常见修复方法
#如果可以从类中移除 ==
和 hashCode
的实现,请执行此操作
dart
class C {
const C();
}
const map = {C() : 0};
如果无法从类中移除 ==
和 hashCode
的实现,则将该 map 设为非常量
dart
class C {
const C();
bool operator ==(Object other) => true;
}
final map = {C() : 0};