openplanning

So sánh đối tượng trong Dart với thư viện Equatable

  1. Cài đặt thư viện
  2. 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.

1. Cài đặt thư viện

pubspec.yaml
dependencies: 
  # https://pub.dev/packages/equatable
  equatable: ^2.0.5

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

Show More