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';
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'; // 追加
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