it will be able to compare different instances of Person.
You can see how this can quickly become a hassle when dealing with complex classes. This is where Equatable comes in!
What does Equatable do?
Equatable overrides == and hashCode for you so you don't have to waste your time writing lots of boilerplate code.
There are other packages that will actually generate the boilerplate for you; however, you still have to run the code generation step which is not ideal.
With Equatable there is no code generation needed and we can focus more on writing amazing applications and less on mundane tasks.
Usage
First, we need to do add equatable to the dependencies of the pubspec.yaml
dependencies:equatable:^3.0.0
Next, we need to install it:
# Dart
dart pub get
# Flutter
flutter packages get
We can now compare instances of Person just like before without the pain of having to write all of that boilerplate.
Note: Equatable is designed to only work with immutable objects so all member variables must be final (This is not just a feature of Equatable - overriding a hashCode with a mutable value can break hash-based collections).
Equatable can implement toString method including all the given props. If you want that behaviour for a specific Equatable object, just include the following:
This flag by default is false and toString will fallback to the default implementation:
Instance of Person
EquatableConfig
stringify can also be configured globally for all Equatable instances via EquatableConfig
EquatableConfig.stringify = true;
If stringify is overridden for a specific Equatable class, then the value of EquatableConfig.stringify is ignored.
In other words, the local configuration always takes precedence over the global configuration.
Note: EquatableConfig.stringify defaults to true in debug mode and false in release mode.
Sometimes it isn't possible to extend Equatable because your class already has a superclass.
In this case, you can still get the benefits of Equatable by using Equatable as a mixin.
Usage
Let's say we want to make an EquatableDateTime class, we can use Equatable like so:
classEquatableDateTimeextendsDateTimewithEquatable{
EquatableDateTime(
int year, [
int month = 1,
int day = 1,
int hour = 0,
int minute = 0,
int second = 0,
int millisecond = 0,
int microsecond = 0,
]) : super(year, month, day, hour, minute, second, millisecond, microsecond);
@overrideList<Object> get props {
return [year, month, day, hour, minute, second, millisecond, microsecond];
}
}
Now if we want to create a subclass of EquatableDateTime, we can just override props.
classEquatableDateTimeSubclassextendsEquatableDateTime{
finalint century;
EquatableDateTimeSubclass(
this.century,
int year,[
int month = 1,
int day = 1,
int hour = 0,
int minute = 0,
int second = 0,
int millisecond = 0,
int microsecond = 0,
]) : super(year, month, day, hour, minute, second, millisecond, microsecond);
@overrideList<Object> get props => [...super.props, century];
}
Benchmarks
You can see and run performance benchmarks by heading over to benchmarks.