背景
-
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());
}
参考記事