freezedとjson_serializableを組み合わせたモデルの実装
freezedの公式に色々書いてましたが、少しハマったのでメモ。
analysis_options.yaml
の 最初の方の Disabling invalid_annotation_target warning and warning in generates files. のところに書いてましたが、現状は freezedとjson_serializableを組み合わせて利用する場合はanalysis_options.yaml に下記を設定する必要があるようです。
analyzer:
errors:
invalid_annotation_target: ignore
モデルクラス
FromJson/ToJson のところに書いてある通りで、
freezedだけのモデルだとこんな感じなのを
import 'package:freezed_annotation/freezed_annotation.dart';
part 'model.freezed.dart';
@freezed
class Model with _$Model {
factory Model.first(String a) = First;
}
👇のようにする
import 'package:freezed_annotation/freezed_annotation.dart';
part 'model.freezed.dart';
part 'model.g.dart'; // 追加
@freezed
class Model with _$Model {
factory Model.first(String a) = First;
factory Model.fromJson(Map<String, dynamic> json) => _$ModelFromJson(json); // 追加
}
ここで注意が必要なのは Map<String, dynamic> toJson() => _$ModelToJson(this); がfreezedと組み合わせてjson_serializableを利用する場合は必要無いというところだと思います。(json_serializable をfreezedと組み合わせずに利用する時は toJson() も必要です)
この理由としては、freezedは toJson() メソッドを xxx.freezed.dart の方で既に追加しているからのようです。
https://pub.dev/documentation/freezed/latest/#:~:text=Since we defined a fromJson%2C this class is de/serializable. Freezed will add a toJson method for us.
pubspec.yaml
普通にpubspec.yamlにjson_serializableは必要です。
dev_dependencies:
json_serializable:
その後、build_runnerを走らせたら完了です。
正しく設定されていたら xxx.freezed.dart, xxx.g.dart が自動生成されて、toJson() や fromJson() が利用できるようになっていると思います。
flutter pub run build_runner build
Discussion