この記事はこちらの和訳です。Flutterを触り始めて理解があやしかったBuild_Valueライブラリについて、自分の勉強用にまとめます。
イントロ
前の記事でも書いたが、DartはJSONシリアライズのサポートが不十分であり、自前で実装するために毎回長いコードを書かなくてはいけない。そこでBuilt Valueの出番となる。
Serializerのセットアップ
2つのステップでセットアップする。
- モデルの定義にstatic Serializerを追加
- トップレベルのSerializerを定義する
1. モデルの定義にstatic Serializerを追加
前の記事のContactモデルを使ってシリアライズの設定をする。
static Serializerを追加するとこのようになる。
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'contact.g.dart';
abstract class Contact implements Built<Contact, ContactBuilder> {
Contact._();
factory Contact([updates(ContactBuilder b)]) = _$Contact;
static Serializer<Contact> get serializer => _$contactSerializer;
int get id;
String get fullName;
@nullable
int get age;
@nullable
String get mobile;
@nullable
bool get isFriend;
}
ここで下記のコマンドで再度contact.g.dart
を生成する
flutter packages pub run build_runner build
するとserializerが追加されているのがわかる。
part of 'contact.dart';
Serializer<Contact> _$contactSerializer = new _$ContactSerializer();
class _$ContactSerializer implements StructuredSerializer<Contact> {...}
class _$Contact extends Contact {...}
class ContactBuilder implements Builder<Contact, ContactBuilder> {...}
2. トップレベルのSerializerを定義する
次にserializers.dart
ファイルを追加する。
// serializers.dart
import 'package:built_value/serializer.dart';
import 'contact.dart';
part 'serializers.g.dart';
// モデルはここのリストに追加する
@SerializersFor([
Contact,
])
final Serializers serializers = _$serializers;
ここで下記のコマンドでserializers.g.dart
を生成する
flutter packages pub run build_runner build
使ってみる
Contact contact3 = Contact((b) => b
..id = 1
..fullName = 'Stack Secrets');
[Contact, id, 1, fullName, Stack Secrets]
serializers.dartを下記のように変更。
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'contact.dart';
part 'serializers.g.dart';
@SerializersFor([
Contact,
])
final Serializers serializers =
(_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
Contact contact3 = Contact((b) => b
..id = 1
..fullName = 'Stack Secrets');
するとJSONフォーマットで出力できた。
{$: Contact, id: 1, fullName: Stack Secrets}