So sánh đối tượng trong Dart với thư viện Equatable
Trong Dart hay bất kỳ ngôn ngữ nào chúng ta luôn cảm thấy khó khăn khi so sánh các đối tượng. Về cơ bản, có quy tắc rõ ràng mà một lớp cần phải triển khai để các đối tượng của nó có thể so sánh với nhau. Tuy nhiên đôi khi chúng ta không chắc rằng code được viết ra là chính xác.

Đầu tiên, chúng ta cần xác định rõ khó khăn thực sự là gì thông qua một ví dụ. Với tiêu chí hai người được được coi là bằng nhau nếu cùng chiều cao và cân nặng.
person.dart
class Person {
String name;
int weight;
int height;
Person({
required this.name,
required this.weight,
required this.height,
});
@override
bool operator ==(Object other) {
if (other is! Person) {
return false;
}
return weight == other.weight && height == other.height;
}
@override
int get hashCode {
return weight * 31 + height;
}
}
Trong lớp Person bạn phải viết đè (override) toán tử == và phương thức hashCode(). Với các lớp có nhiều thuộc tính cần so sánh việc viết đúng phương thức hashCode() là một thách thức không nhỏ.
Để giải quyết vấn đề này bạn có thể sử dụng thư viện equatable. Lớp của bạn chỉ cần mở rộng từ lớp Equatable và khai báo các tiêu chí cần so sánh. Toán tử == và phương thức hashCode() đã được viết một cách chính xác trong nội bộ lớp Equatable.
2. Equatable
Bây giờ chúng ta sẽ xem xét cách sử dụng thư viện equatable cho lớp Employee. Hai đối tượng của lớp Employee được coi là bằng nhau nếu tất cả các thuộc tính tương ứng của chúng bằng nhau.
employee.dart
import 'package:equatable/equatable.dart';
class Employee extends Equatable {
int id;
String fullName;
double salary;
Employee(this.id, this.fullName, this.salary);
@override
List<Object?> get props => [id, fullName, salary];
}
Test:
employee_test.dart
import 'employee.dart';
void main() {
Employee tom = Employee(1, "Tom", 1000);
Employee tom2 = Employee(1, "Tom", 1000);
Employee jerry = Employee(2, "Jerry", 1000);
print("tom == tom2? ${tom == tom2}"); // true
print("tom == jerry? ${tom == jerry}"); // false
}
Output:
tom == tom2? true
tom == jerry? false
Các hướng dẫn lập trình Dart
- Kiểu dữ liệu Boolean trong Dart
- Hướng dẫn và ví dụ hàm trong Dart
- Hướng dẫn và ví dụ Dart Closures
- Interface trong Dart
- Hướng dẫn và ví dụ phương thức trong Dart
- Constructor trong Dart
- Property trong Dart
- Toán tử chấm chấm (..) trong Dart
- Hướng dẫn và ví dụ Dart Generics
- Lập trình Dart với công cụ trực tuyến DartPad
- Cài đặt Dart SDK trên Windows
- Cài đặt Visual Studio Code trên Windows
- Cài đặt Dart Code Extension cho Visual Studio Code
- Cài đặt Dart Plugin cho Android Studio
- Chạy ví dụ Dart đầu tiên của bạn trong Visual Studio Code
- Chạy ví dụ Dart đầu tiên của bạn trong Android Studio
- Hướng dẫn và ví dụ Dart Stream
- Dart JSON với thư viện dart:convert
- Hướng dẫn và ví dụ Dart List
- Biến (Variable) trong ngôn ngữ Dart
- Hướng dẫn và ví dụ Dart Map
- Vòng lặp trong Dart
- Xử lý Dart JSON với gói dart_json_mapper
- Trình chuyển đổi mã nguồn (Transpiler) là gì?
- Phân tích XML trong Dart
- Hướng dẫn và ví dụ Dart http
- Hướng dẫn và ví dụ Dart Future
- Các phương thức mở rộng (Extension) trong Dart
- Mixins trong Dart
- Bài thực hành Dart phân tích JSON với gói dart:convert
- Bài thực hành Dart http CRUD
- Từ khoá part và part of trong Dart
- Hướng dẫn và ví dụ Dart Dio
- So sánh đối tượng trong Dart với thư viện Equatable
- Xử lý lỗi trong Dart Stream
- Dart Stream Single và Broadcast
Show More