💽
【Flutter】Hiveの対応しているオブジェクト以外も格納できるようにする
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オブジェクトも格納することができるようになりました。
間違っているところや改善した方がいい所がありましたら
ご指摘していただけると助かります。
Discussion