Flutter – Dlaczego Musisz Używać Biblioteki Equatable?
W jaki sposób działa porównywanie obiektów Dart? Wyjaśniam to i opisuje użycie biblioteki Equatable.
W języku Dart porównywanie obiektów polega na porównywaniu ich referencji, czyli sprawdzaniu, czy dwa obiekty wskazują na ten sam obszar w pamięci. Oznacza to, że nawet jeśli dwa obiekty mają identyczne wartości składowe, nadal zostaną uznane za różne podczas porównywania.
Możesz to łatwo zrozumieć, analizując poniższy listing.
var numbers1 = [1, 2, 3];
var numbers2 = [1, 2, 3];
var anotherNumbers = numbers1;
print(numbers1 == numbers2); // false
print(anotherNumbers == numbers1); // true
Biblioteka Equatable
jest używana do ułatwienia procesu porównywania obiektów. I jest w zasadzie niezbędna, gdy implementujesz stanowość za pomocą np. bloc czy provider. Zyskujesz dzięki temu kontrolę nad procesem porównywania: porównujesz za pomocą wartości, a nie referencji.
Co oznacza, że między innymi np. do unikania niepotrzebnego odświeżania widoku w przypadku, gdy wartości zmiennych w obiekcie pozostają niezmienione. Dlatego używaj Equatable w klasach, które reprezentują stan (czyli w klasach, które wykorzystujesz to aktualizacji UI).
Biblioteka Equatable pozwala na zmianę sposobu porównywania obiektów z domyślnego opierającego się na porównywaniu referencji na porównywanie składowych dwóch obiektów.
Dostarcza ona m.in. właściwość props
, której implementacja w Twojej klasie powinna zawierać listę wszystkich jej składowych, które mają wpływ ja wartość. Dzięki temu, jeśli dwa obiekty mają takie same wartości składowe, są one traktowane jako równoważne, nawet jeśli są to różne instancje.
Spójrz na poniższy listing, który przedstawia przykładową implementację.
import 'package:equatable/equatable.dart';
class Animal extends Equatable {
final String name;
final int age;
Animal({required this.name, required this.age});
@override
List<Object?> get props => [name, age];
}
final animal1 = Animal(name: "Tiger", age: 8);
final animal2 = Animal (name: "Tiger", age: 8);
print(animal1 == animal2); // true
Wynik porównania obiektów animal1
i animal2
ze sobą potwierdza to, co napisałem w poprzednim akapicie. Gdybyśmy nie użyli możliwości Equatable
, to wtedy to takie porównanie zwróciłoby wartość false
.
👉 A Ty korzystasz już z Equtable? A może istnieje inna alternatywa?
Daj znać w komentarzu! 🔤
Swoją drogą na jesień tego roku planowana jest premiera mojej książki "Flutter. Podstawy". Jeśli interesuje Cię ta technologia, to możesz zapisać się na listę oczekujących na stronie wydawnictwa Helion:
https://helion.pl/ksiazki/flutter-podstawy-krzysztof-baranowski,flupod.htm#format/d