Skip to main content

avoid_equals_and_hash_code_on_mutable_classes

verified_userStable

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

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:

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

GOOD:

dart
@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:

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

Enable

#

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:

analysis_options.yaml
yaml
linter:  rules:  - avoid_equals_and_hash_code_on_mutable_classes 

If you're instead using the YAML map syntax to configure linter rules, add avoid_equals_and_hash_code_on_mutable_classes: true under linter > rules:

analysis_options.yaml
yaml
linter:  rules:  avoid_equals_and_hash_code_on_mutable_classes: true