Пакет Dart Equality и Equatable

Nov 27 2022
Равенство используется для проверки равенства двух объектов с помощью оператора ==. Если два объекта равны, то оператор == оценивается как истина, в противном случае он оценивается как ложь.

Равенство используется для проверки равенства двух объектов с помощью ==оператора. Если два объекта равны, ==оператор оценивается как , в trueпротивном случае он оценивается как false.

В Dart по умолчанию ==оператор проверяет ссылочное равенство и оценивает, trueкогда два объекта являются одним и тем же экземпляром или принадлежат одной и той же ссылке. Если мы сравним два непостоянных объекта, которые имеют одинаковые значения, то он оценивается как false.

  1. Создадим Userкласс:
  2. 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. А что, если мы хотим сравнить два непостоянных объекта по значению, а не по ссылке?

Итак, решение состоит в том, что нам нужно переопределить ==оператор и hashCodeвот так:

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;
}

И теперь, если мы сравним два непостоянных Userобъекта, которые имеют одинаковые значения, тогда оператор напечатает true.

И это много стандартного кода!

Простой способ добиться этого — использовать пакет Equatable .

  1. Добавьте эквивалентную зависимость pubspec.yamlвашего проекта флаттера:
  2. 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];
    }
    

Спасибо за прочтение!

Youtube: Бекар Программист