💽

【Flutter】Hiveの対応しているオブジェクト以外も格納できるようにする

2022/03/03に公開

Hiveの対応していないオブジェクトを格納したい

Hiveはすべてのプリミティブ型とList、Map、DataTimeとUint8Listに対応しています。
しかしこれ以外のオブジェクトも保存したいケースがあると思います。

・Fileを保存したい
・MaterialColorを保存したい
etc...

TypeAdaterを作成する

オブジェクトをバイナリ形式に変換するTypeAdapterを作成して登録することで、オブジェクトを格納できます。

通常はhive_generatorを使って自動生成すると思いますが対応していないオブジェクトなので

Error: HiveError: Cannot write, unknown type: File. Did you forget to register an adapter? 

などとエラーがでて保存できません。

TypeAdapterを自分で作る

FileオブジェクトのTypeAdapterを作ってみます。

file_adapter.dart
import 'dart:io';

import 'package:hive_flutter/adapters.dart';

class FileAdapter extends TypeAdapter<File> {
  
  final typeId = 223; // 0~223まで

  
  File read(BinaryReader reader) {
    final numOfFields = reader.readByte();
    final fields = <int, dynamic>{
      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
    };
    return File(fields[0] as String);
  }

  
  void write(BinaryWriter writer, File obj) {
    writer
      ..writeByte(1)
      ..writeByte(0)
      ..write(obj.path);
  }
}

作成したAdapterをregisterAdapterで登録します。

main.dart
void main() async {
  // Hive初期化
  await Hive.initFlutter();

  // Adapter登録
  Hive.registerAdapter(FileAdapter());

  runApp(child:const MyApp());
}

これでFileオブジェクトも格納することができるようになりました。

間違っているところや改善した方がいい所がありましたら
ご指摘していただけると助かります。

参考文献

hive docs

Discussion