반응형
[Flutter] Equatable
Equatable은 인스턴스와 인스턴스가 같은지 판단을 쉽게 해주는 라이브러리입니다.
https://pub.dev/packages/equatable
Equatable은 굳이 사용안해도 되는 라이브러리 이지만, 사용할 경우 개발 생산성을 향상 시킵니다.
아래 예시로 설명하겠습니다.
Dart에서 DTO를 구현하려면 아래와 같이 선언을 할 수 있습니다.
인스턴스와 다른 인스턴스가 같은지 비교하기 위해서는 "operator ==", hashCode 메소드를 아래와 같이 구현할 수있습니다.
class Employee {
final int id;
final String name;
const Employee({
@required this.id,
@required this.name,
}) : assert(id != null);
factory Employee.fromJson(dynamic json) {
return Employee(id: json['id'], name: json['name']);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
@override
int get hashCode => id.hashCode ^ name.hashCode;
@override
bool operator ==(dynamic other) =>
identical(this, other) || other is Employee && id == other.id && name == other.name;
}
Operator ==
oop라는 명칭이 생겨난 이유는 모든 클래스가 기본적으로 object를 extend 하기 때문입니다.
-> Object라는 최상위 클래스가 제공해주는 모든 파라미터들을 모든 클래스들이 사용할 수 있다는 뜻입니다.
대부분의 언어에서는 이 Object라는 클래스에 한 인스턴스와 다른 인스턴스를 비교하는 알고리즘이 정의되어 있습니다.
Dart언어 에서는 operator라는 함수에 정의가 되어있고 이를 override 함으로써 값의 비교 알고리즘을 자유롭게 변경할 수 있습니다.
Hash Code
hashcode 함수는 Map 또는 Set에서 키의 역할을 하게 됩니다.
Map이나 Set은 키가 중복으로 저장될 수 없기 떄문에 Set, Map의 키로 오브젝트가 저장되었을 때 어떻게 키값을 정의할지가 중요합니다.
Employee 프로퍼티가 2개일땐 구현하기 쉽지만,
프로퍼티가 늘어나면 늘어날수록 operator와 hashcode를 작성하는것이 귀찮아집니다.
equalstable을 쓰면 다음과 같이 할 수 있습니다.
class Employee extends EquaTable{
final int id;
final String name;
const Employee({
@required this.id,
@required this.name,
}) : assert(id != null);
factory Employee.fromJson(dynamic json) {
return Employee(id: json['id'], name: json['name']);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
};
}
@override
List<Object> get props => [this.id, this.name];
}
Equatable 클래스를 상속 받고 props라는 메소드를 override 해주면 됩니다.
props 메소드는 리스트를 받게되는데 이 리스트에 들어가는 모든 값들의 조합이 "operator =="와 hascode 함수를 생성하는데 사용됩니다.
참고 문헌
https://blog.codefactory.ai/flutter/equatable/
반응형
'Mobile > Flutter' 카테고리의 다른 글
[Flutter] 권한 정의 - Permission (0) | 2021.06.18 |
---|---|
[Flutter] 앱 런처 로고 변경 (0) | 2021.06.18 |
[Flutter] 앱 이름 변경 (0) | 2021.06.18 |
[Flutter] 파이어베이스 세팅 - Firebase Setting (0) | 2021.05.17 |