LoginSignup
0
0

More than 1 year has passed since last update.

【Flutter】hiveとfreezedを組み合わせて使う

Posted at

背景

  • hiveの後発であるisarを使ってエンティティクラス(@collectionクラス)をfreezedでimmuatbleにできないか調べていたところ、hiveだったら似たようなことができそうなことがわかった。(isarではまだできなさそう。)
  • isarでもエンティティクラスとimmutableなクラスを分けて変換を挟めばできなくはないが、変換処理をエンティティごとに定義するのは面倒。

まとめ

後述の参考記事を参考に以下のようにしました。(正直あんまりよくわかってません。:sob:

  • Userは複数のItemを持っている。
  • HiveObjectを継承することで、keyプロパティやsavedeleteメソッドを使えるようにしている。
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());
}

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0