跳到主要內容

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