[Flutter]Hive DB로 내부저장소 사용하기 #2 타입 어댑터

S_Soo100·2023년 3월 16일
0

flutter

목록 보기
8/19
post-thumbnail

1. TypeAdapter란?

  • Hive Box와 연동하는 커스텀 오브젝트 이다.
  • Hive DB는 기본적으로 원시값과 배열, Map 이 들어가지만,
    여기에 TypeAdapter를 통해 커스텀한 클래스를 집어넣을 수 있다.

2. 어댑터 만들기

  1. 클래스 선언문 위에 @HiveType(typeId: n) 라고 주석을 표기한다.

  2. build_runner를 실행하기 위해 part ‘파일명.g.dart 라고 표기한다.

  3. 모든 클래스 안의 필드에 @HiveField(n)를 표기한다.

    (이 필드 번호는 바이너리 포맷으로 필드를 식별하는데 사용되며, 어댑터 클래스를 사용 중인 후에는 변경하면 안된다.)

  4. 터미널에 $ flutter packages pub run build_runner build 라고 실행!

    (이미 빌드러너가 만든 코드가 있는 경우 에러가 난다, $ flutter pub run build_runner build --delete-conflicting-outputs 라고 입력하면 에러 없이 잘 생성된다.)

  5. 만들어진 어댑터 클래스는 기본적으로 “클래스 이름 + Adapter”로 만들어진다.
    해당 이름은 변경이 가능하다.

  • 예시 코드
//person.dart

import 'package:hive/hive.dart';

part 'person.g.dart';

(typeId: 1) //0번부터 순서대로
class Person {
  (0) //어댑터당 새롭게 0번부터 시작
  String name;

  (1)
  int? age;

  (2)
  List<Person> friends;
}

어댑터 관련 사항

  1. 어댑터의 필드는 nullable로 짤 수 있다.

  2. 어댑터 안의 필드가 추가될 경우, 기존 필드와 필드 번호는 내버려두고
    새로운 번호를 가진 새로운 필드를 그 아래 선언하면 된다.
    다 했으면 다시 $ flutter pub run build_runner build --delete-conflicting-outputs 실행

  3. 필드 “번호”만 같으면, 이름은 변경 가능하다.

  4. 초깃값 설정이 가능하다. annotation에 기재한다.

    (typeId: 2)
    class Customer {
      (1, defaultValue: 0.0)
      double balance;
    }

3. 어댑터 적용하기

  • 어댑터 타입을 사용하는 Box를 열기 전에, 어댑터를 먼저 등록해준다. 그리고 어댑터를 사용할 box의 타입을 지정해서 불러낸다.
Hive.registerAdapter(MyObjectAdapter());
await Hive.openBox<MyObjectAdapter>('user');
  • 모델 클래스로 사용하기
    • 기존 사용하던 모델 클래스가 있다면, 모델 ↔ 어뎁터로 왔다갔다 하는 함수를 짜서 사용하거나, 어댑터 클래스를 그 자체로 모델 클래스로 사용할 수 있다.
    • Freezed랑 다르게 toMap등의 부가기능을 전혀 제공하지 않기 때문에 직접 짜야 한다.
Map<String, dynamic> toJson() {
	return {
		'name' : name,
		'age' : age ?? 0,
	};
}

factory Person.fromJson(Map<String, dynamic> map) {
	return Person(
      name: json['name'] as String,
      age: json['age']?.toInt() ?? 0,
	);
}
profile
플러터, 리액트

0개의 댓글