跳到主要内容

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};