🦷

Hiveでフィールド追加した時に type 'Null' is not a subtype of type になる

2023/08/26に公開

FlutterでHiveを使っているときに発生したエラーについてメモ。

発生事象

Hiveでカスタムオブジェクトに新しくフィールドを追加したときに、追加前のデータが存在していると下記のエラーが発生してしまう。

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'List<dynamic>' in type cast
#0      CostDaoModelAdapter.read (package:flutter_template/infrastructure/local_storage/domain/cost/cost_dao_model.g.dart:26:24)

TypeAdaptarでフィールドをReadしているときにNullをキャストして怒られているようです。
エラーの時点で使用していたTypeAdapterはhive_generator: ^2.0.1で自動生成されたものだったのでNullチェックがされていませんでした。
新しいフィールドを使う時、HiveFieldの番号が被らなければ問題ないのかと思っていましたが自動生成したTypeAdapterを使う場合は、前のバージョンとのデータの整合性を考慮する必要があるようです。

解決策

とりあえず追加したフィールドについてNullチェックをするように修正する。

- tags: (fields[6] as List).cast<TagDaoModel>(),
+ tags: fields[6] != null ? (fields[6] as List).cast<TagDaoModel>() : [],

また自動生成されたコードには

// GENERATED CODE - DO NOT MODIFY BY HAND

とあるので一応別のファイルへ実装を移動しました。
無事Hiveのカスタムオブジェクトにフィールドを追加することができました。

FlutterでSpenderというアプリを作っています。
よかったらこちらも見てみてください🤖

https://note.com/nugget_okapi/n/n7c52a591b16d

Discussion