본문 바로가기
Mobile/Flutter

[Flutter] Equatable - For Dart DTO

by IsBerry 2021. 6. 30.
반응형

 


[Flutter] Equatable

 

Equatable은 인스턴스와 인스턴스가 같은지 판단을 쉽게 해주는 라이브러리입니다.

https://pub.dev/packages/equatable

 

equatable | Dart Package

A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.

pub.dev

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