0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Built_Valueのすすめ (シリアライズ)

この記事はこちらの和訳です。Flutterを触り始めて理解があやしかったBuild_Valueライブラリについて、自分の勉強用にまとめます。

イントロ

前の記事でも書いたが、DartはJSONシリアライズのサポートが不十分であり、自前で実装するために毎回長いコードを書かなくてはいけない。そこでBuilt Valueの出番となる。

Serializerのセットアップ

2つのステップでセットアップする。
1. モデルの定義にstatic Serializerを追加
2. トップレベルの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}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?