https://pub.dev/packages/equatable

Khi bạn muốn so sánh hai đối tượng trong Dart, bạn cần phải ghi đè phương thức ==hashCode. Điều này có thể là một công việc khá mệt mỏi và dễ dẫn đến lỗi nếu bạn không thực hiện nó đúng cách.

Equatable là một gói công cụ đơn giản nhưng mạnh mẽ giúp giải quyết vấn đề này. Nó cung cấp một cách dễ dàng để tạo ra các lớp Dart immutable (không thể thay đổi) mà tự động thực hiện so sánh và băm hashcode dựa trên các trường dữ liệu của lớp.

Khi sử dụng equatable, bạn chỉ cần kế thừa lớp Equatable và gọi phương thức props để truyền các trường dữ liệu mà bạn muốn so sánh. equatable sẽ tự động sinh mã cho bạn để so sánh các trường dữ liệu này và tạo hashcode một cách đáng tin cậy.

Đây là một ví dụ đơn giản về cách sử dụng equatable:

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  List<Object?> get props => [name, age];
}

Khi bạn muốn so sánh hai đối tượng Person, bạn chỉ cần sử dụng toán tử == mà không cần phải tự viết mã so sánh.

What is hashCode?

Mã băm (hashcode) là một giá trị số nguyên được tính từ dữ liệu của đối tượng nhằm mục đích tối ưu hóa việc lưu trữ và truy xuất dữ liệu trong các cấu trúc dữ liệu như bảng băm (hash table). Mục đích của việc tính mã băm là tạo ra một giá trị duy nhất đại diện cho dữ liệu của đối tượng đó.

Trong Dart, bạn có thể ghi đè phương thức hashCode để tạo ra mã băm cho đối tượng của bạn. Điều này quan trọng khi bạn muốn sử dụng đối tượng của mình trong các cấu trúc dữ liệu như Map hoặc khi bạn muốn so sánh đối tượng với nhau một cách hiệu quả.

Dưới đây là một ví dụ đơn giản về cách ghi đè phương thức hashCode trong Dart:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  int get hashCode => name.hashCode ^ age.hashCode;
  
  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Person &&
          runtimeType == other.runtimeType &&
          name == other.name &&
          age == other.age;
}

Trong ví dụ này, phương thức hashCode được ghi đè để tính toán mã băm dựa trên các trường dữ liệu của đối tượng (nameage). Trong trường hợp này, chúng ta sử dụng toán tử ^ để kết hợp các mã băm của nameage lại với nhau. Điều này giúp đảm bảo rằng mã băm được tạo ra là duy nhất đối với mỗi đối tượng Person dựa trên dữ liệu của nó.