【Flutter】オブジェクトを便利にするfreezed, json_serializable
こんにちは、フリーランスエンジニアの太田雅昭です。
Flutter
Flutterはクロスプラットフォーム開発環境です。普段JavaScriptに慣れていると、面倒だと感じることも多いのですが、今回はそれを解決していきます。
build_runner
まずはbuild_runnerをインストールします。
flutter pub add dev:build_runner
以下のようにして、自動生成します。
dart run build_runner build
監視を続けるには、watchを使用します。
dart run build_runner watch
freezed
freezedは、クラスをまるでJavaScriptオブジェクトのように(語弊)扱えるようにします。以下のように使用します。
flutter pub add freezed_annotation dev:freezed
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.freezed.dart';
@freezed
class User with _$User {
const factory User({
required String name,
required int age,
}) = _User;
}
const taro = User(name: 'Taro', age: 10);
print(taro); // 自動でtoString()が呼ばれる
print(taro.copyWith(age: 11)); // 年齢だけ変える
print(taro == User(name: 'Taro', age: 10)); // true
json関連
jsonへのencode,decodeは、別ライブラリを追加します。
flutter pub add json_annotation dev:json_serializable
freezedをすでに使っているため、2行追加するだけです。
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.freezed.dart';
// 追加
part 'user.g.dart';
@freezed
class User with _$User {
const factory User({
required String name,
required int age,
}) = _User;
// 追加
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
print(taro.toJson()); // {name: Taro, age: 10}
print(User.fromJson(jsonDecode('{"name": "Taro", "age": 10}'))); // User(name: Taro, age: 10)