avoid_equals_and_hash_code_on_mutable_classes

Group: style

Maturity: stable

Dart SDK: >= 2.6.0 • (Linter v0.1.97)

Since info is static, may be stale

View all Lint Rules

Using the Linter

From Effective Dart:

AVOID overloading operator == and hashCode on classes not marked @immutable.

If a class is not immutable, overloading operator == and hashCode can lead to unpredictable and undesirable behavior when used in collections.

BAD:

class B {
  String key;
  const B(this.key);
  @override
  operator ==(other) => other is B && other.key == key;
  @override
  int get hashCode => key.hashCode;
}

GOOD:

@immutable
class A {
  final String key;
  const A(this.key);
  @override
  operator ==(other) => other is A && other.key == key;
  @override
  int get hashCode => key.hashCode;
}

NOTE: The lint checks the use of the @immutable annotation, and will trigger even if the class is otherwise not mutable. Thus:

BAD:

class C {
  final String key;
  const C(this.key);
  @override
  operator ==(other) => other is C && other.key == key;
  @override
  int get hashCode => key.hashCode;
}

Usage

To enable the avoid_equals_and_hash_code_on_mutable_classes lint, add avoid_equals_and_hash_code_on_mutable_classes under linter > rules in your analysis_options.yaml file:

linter:
  rules:
    - avoid_equals_and_hash_code_on_mutable_classes