背景
-
hive
の後発であるisar
を使ってエンティティクラス(@collection
クラス)をfreezed
でimmuatbleにできないか調べていたところ、hive
だったら似たようなことができそうなことがわかった。(isar
ではまだできなさそう。) -
isar
でもエンティティクラスとimmutableなクラスを分けて変換を挟めばできなくはないが、変換処理をエンティティごとに定義するのは面倒。
まとめ
後述の参考記事を参考に以下のようにしました。(正直あんまりよくわかってません。)
-
User
は複数のItem
を持っている。 -
HiveObject
を継承することで、key
プロパティやsave
、delete
メソッドを使えるようにしている。
user.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart';
import 'item.dart';
part 'user.freezed.dart';
part 'user.g.dart';
@freezed
abstract class User extends HiveObject with _$User {
User._();
@HiveType(typeId: 0)
factory User({
@HiveField(0) required String name,
@HiveField(1) required int age,
@HiveField(2) required List<Item> items,
}) = _User;
}
item.dart
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart';
part 'item.freezed.dart';
part 'item.g.dart';
@freezed
abstract class Item extends HiveObject with _$Item {
Item._();
@HiveType(typeId: 1)
factory Item({
@HiveField(0) required String name,
@HiveField(1) required String color,
}) = _Item;
}
それぞれでTypeAdapter
が生成されるので、それらの登録も忘れずに。。。
main.dart
void main() async {
Hive.registerAdapter(UserAdapter());
Hive.registerAdapter(ItemAdapter());
var box = await Hive.openBox<User>('userBox');
box.add(User(
name: 'Tanaka', age: 34, items: [Item(name: 'name', color: 'color')]));
box.add(User(name: 'Yamada', age: 17, items: []));
print(box.values.first.key);
runApp(const MyApp());
}
参考記事