Flutter の freezed を使い、immutable なモデルクラスを生成します。

まずは、必要なパッケージをインストールします。

freezed をインストールするために、ターミナルで、flutter pub add freezed --devを実行します。

freezed とセットで必要となる freezed_annotation をインストールするために、ターミナルで、flutter pub add freezed_annotationを実行します。

オブジェクトと JSON の文字列を変換するために、json_serializable と json_annotation をインストールします。

ターミナルで、flutter pub add json_serializable --devを実行します。

もし、インストール時や実行時エラーが発生した場合、json_serializable のバージョンを 6.1.0 にすると、うまくいきました。

ターミナルで、flutter pub add json_annotationを実行します。

こちらもインストール時や実行時エラーが発生した場合、json_annotation のバージョンを 4.4.0 にすると、うまくいきました。

最後に、クラスを生成するために build_runner をインストールします。

ターミナルでflutter pub add build_runner --devを実行します。

さらにターミナルでflutter pub getを実行します。

インストールが一通り完成したので、次はモデルを作成します。

models フォルダを作成します。

models フォルダ内に、book_model.dart を作成します。

foundation.dart と freezed_annotation.dart をインポートします。

import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

クラスの生成先となる、book_model.freezed.dart と book_model.g.dart を指定します。

part 'book_model.freezed.dart';
part 'book_model.g.dart';

pub.dev の freezed の例(https://pub.dev/packages/freezed)に沿って、クラスを作成します。

クラスの上には、@freezed を指定します。

こちらを指定することで、下に作成したクラスの内容を freezed がモデルクラスを作成してくれます。

今回は、title を author、createdAt を指定します。


part 'book_model.freezed.dart';
part 'book_model.g.dart';

@freezed
class Book with _$Book {
  const factory Book({
    required String title,
    required String author,
    required DateTime createdAt,
  }) = _Book;

  factory Book.fromJson(Map<String, dynamic> json) => _$BookFromJson(json);
}

クラスが作成できたので、ターミナルで、flutter packages pub run build_runner build --delete-conflicting-outputsを実行します。

この時点で、part 'book_model.g.dart';に『Target of URI hasn't been generated: 'book_model.g.dart'.Try running the generator that will generate the file referenced by the URI.』のエラーが発生した場合、json_serializable と json_annotation のバージョンを疑ってください。

models フォルダに book_model.freezed.dart と book_model.g.dart が生成されました。

image2

book_model.freezed.dart の中身は、CopyWith などのモデルクラスが生成されています。

image3

book_model.g.dart の中身は、FromJson と ToJson のメソッドが生成されています。

image4

ブログ一覧