😺

freezedとjson_serializableを組み合わせたモデルの実装

2022/06/08に公開

freezedの公式に色々書いてましたが、少しハマったのでメモ。

analysis_options.yaml

https://pub.dev/documentation/freezed/latest/
の 最初の方の Disabling invalid_annotation_target warning and warning in generates files. のところに書いてましたが、現状は freezedとjson_serializableを組み合わせて利用する場合はanalysis_options.yaml に下記を設定する必要があるようです。

analyzer:
  errors:
    invalid_annotation_target: ignore

モデルクラス

FromJson/ToJson のところに書いてある通りで、
https://pub.dev/documentation/freezed/latest/#:~:text=extended nor implemented.-,FromJson/ToJson,-While Freezed will

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() も必要です)
https://pub.dev/packages/json_serializable

この理由としては、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