Contents
Contents

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

This rule is available as of Dart 2.6.0.

Details

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 rule, 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