avoid-mutable-equatable-subclass-fields

Path
lint/correctness/avoid-mutable-equatable-subclass-fields
Default
On (recommended)
Origin
Falcon
Domain
equatable
Rule
93 of 512
recommendedequatable

Flags mutable instance fields on subclasses inheriting Equatable equality.

Changing value-object state can invalidate hash-based collection membership. This checks declared fields, including private, late and primary-constructor fields, only when the resolved inherited equality implementation belongs to package:equatable Equatable or EquatableMixin. Static, final, abstract and external fields, interface-only implementations, unresolved inheritance and classes replacing equality themselves are excluded.

Invalid

example.dartdart
import 'package:equatable/equatable.dart';
import 'package:equatable/equatable.dart' as eq;
import 'support.dart';
class Direct extends Equatable {
  int value = 1;
  List<Object?> get props => [value];
}
class MixedValue with EquatableMixin {
  int value = 1;
  List<Object?> get props => [value];
}
class Indirect extends Middle {
  int child = 1;
}
class Prefixed extends eq.Equatable {
  late int value;
  List<Object?> get props => [value];
}
class Private extends Mixed {
  int _value = 1;
}
Mutable fields can invalidate `Equatable` equality and hash codes. Make this field `final`.
4class Direct extends Equatable {
5 int value = 1;
Mutable fields can invalidate `Equatable` equality and hash codes. Make this field `final`.
8class MixedValue with EquatableMixin {
9 int value = 1;
Mutable fields can invalidate `Equatable` equality and hash codes. Make this field `final`.
12class Indirect extends Middle {
13 int child = 1;
Mutable fields can invalidate `Equatable` equality and hash codes. Make this field `final`.
15class Prefixed extends eq.Equatable {
16 late int value;
Mutable fields can invalidate `Equatable` equality and hash codes. Make this field `final`.
19class Private extends Mixed {
20 int _value = 1;

Valid

example.dartdart
import 'package:equatable/equatable.dart';
import 'support.dart';
class Immutable extends Equatable {
  final int value = 1;
  List<Object?> get props => [value];
}
class Static extends Parent { static int value = 1; }
class LateFinal extends Middle { late final int value; }
class Constants extends Mixed { static const int value = 1; }
class GetterOnly extends Parent { int get value => 1; }
class OwnEquality extends Parent {
  int value = 1;
  bool operator ==(Object other) => identical(this, other);
  int get hashCode => 0;
}
class Unrelated { int value = 1; }
class InterfaceOnly implements Equatable {
  int value = 1;
  List<Object?> get props => [value];
}

Configure avoid-mutable-equatable-subclass-fields

Set its severity in falcon.json. See the configuration guide.

falcon.jsonjson
{
  "linter": {
    "rules": {
      "correctness": {
        "avoid-mutable-equatable-subclass-fields": "error"
      }
    }
  }
}

Or silence one occurrence with a suppression comment; the reason is required.

example.dartdart
// falcon-ignore lint/correctness/avoid-mutable-equatable-subclass-fields: <reason>