Сегодня поговорим про библиотеку equatable, которая помогает упростить сравнение объектов.
Установка
Yaml
dependencies:
equatable: ^2.0.7
Зачем нужна библиотека?
В Dart по умолчанию два объекта считаются равными, только если они ссылаются на один и тот же экземпляр в памяти. Но часто требуется сравнивать объекты по их полям. Equatable автоматически реализует методы == (оператор равенства) и hashCode, что избавляет разработчиков от написания шаблонного кода.
Без Equatable:
class Person {
Person(this.name, this.age);
final String name;
final int age;
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is Person &&
other.name == name &&
other.age == age;
}
@override
int get hashCode => name.hashCode ^ age.hashCode;
}С Equatable:
import 'package:equatable/equatable.dart';
class Person extends Equatable {
Person(this.name, this.age);
final String name;
final int age;
@override
List<Object?> get props => [name, age]; // Поля для сравнения
}
Основные возможности
▫️Equatable переопределяет == и hashCode на основе списка полей (props)
▫️Можно использовать Equatable в иерархии классов
▫️Рекомендуется использовать с неизменяемыми (final) полями
▫️Часто применяется в State Management для эффективного сравнения состояний
Использование EquatableMixin
Если ваш класс уже наследуется от другого класса, но вам нужна функциональность Equatable, можно использовать
EquatableMixin:
import 'package:equatable/equatable.dart';
class Person extends SomeOtherClass with EquatableMixin {
Person(this.name, this.age);
final String name;
final int age;
@override
List<Object?> get props => [name, age];
}
Преимущества EquatableMixin
▫️Позволяет добавить сравнение объектов без изменения иерархии наследования
▫️Сохраняет все возможности Equatable, но в виде миксина
Пример использования
void main() {
final person1 = Person("Alice", 30);
final person2 = Person("Alice", 30);
print(person1 == person2); // true (без Equatable было бы false)
}📎 Ссылка на библиотеку
❤️ — если используете Equatable в ваших проетах
