Dart Equality e Equatable Package

A igualdade é usada para verificar se dois objetos são iguais ou não usando o ==
operador. Se dois objetos forem iguais, o ==
operador será avaliado como true
, caso contrário, será avaliado como false
.
No Dart, por padrão, o ==
operador verifica a igualdade referencial e avalia true
quando dois objetos são a mesma instância ou pertencem à mesma referência. Se compararmos dois objetos não constantes que têm os mesmos valores, ele será avaliado como false
.
- Vamos criar uma
User
classe:
class User {
final String? name;
final int? age;
const User({this.name, this.age});
}
void main() {
User user = User(name: "Usama", age: 10);
User administrator = User(name: "Usama", age: 10);
print(user == administrator);
}
void main() {
User user = const User(name: "Usama", age: 10);
User administrator = const User(name: "Usama", age: 10);
print(user == administrator);
}
4. Mas e se quisermos comparar dois objetos não constantes por valor e não por referência?

Então a solução é, precisamos substituir o ==
operador e hashCode
assim:
class User {
final String? name;
final int? age;
const User({this.name, this.age});
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is User &&
runtimeType == other.runtimeType &&
name == other.name &&
age == other.age;
@override
int get hashCode => name.hashCode ^ age.hashCode;
}
E agora, se compararmos dois User
objetos não constantes que têm os mesmos valores, a instrução será impressa true
.
E isso é um monte de código clichê!

Uma maneira simples de conseguir isso é usando o pacote Equatable .
- Adicione a dependência igualável em
pubspec.yaml
seu projeto flutter:
dependencies:
flutter:
sdk: flutter
equatable: ^2.0.5
import 'package:equatable/equatable.dart';
class User extends Equatable {
const User({this.name, this.age});
final String? name;
final int? age;
@override
List<Object?> get props => [name, age];
}
Obrigado por ler!
Youtube: Programador Bekar
