providerパッケージの作者であるRemi Rousseletさんが先月リリースした
freezedパッケージが日本のFlutter界隈でも話題になっていますね
あと、Kotlinのdata class相当のものがなくてコンストラクタ周りやcopyWithなど書くのが少々怠かったけど、freezedのおかげですっかり解決してしまった( ´・‿・`)
— mono 🎯 @自宅 💙 (@_mono) March 4, 2020
(言語機能組み込みではなくコード生成系特有の扱いにくさがあって完璧ではないけど)https://t.co/WgXtYthYzB
ざっと触ってみたのでメモします
使い方
pubspec.yaml
json_serializable
はJSONとのencode/decodeしたいのであれば
dependencies:
flutter:
sdk: flutter
freezed_annotation:
dev_dependencies:
flutter_test:
sdk: flutter
json_serializable:
build_runner:
freezed:
buildする
いつもの
flutter pub pub run build_runner build
スニペット
AndroidStudioでは以下をLive Templateに登録しておくと開発が捗りそう
part .g.dart
の行、fromJson
の行はJSONとのencode/decodeいらないなら不要です
引用元: Comparing freezed to built_value
import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part '$FILE_NAME$.freezed.dart';
part '$FILE_NAME$.g.dart';
@freezed
abstract class $CLASS_NAME$ with _$$$CLASS_NAME$ {
const factory $CLASS_NAME$({}) = _$CLASS_NAME$;
factory $CLASS_NAME$.fromJson(Map<String, dynamic> json) => _$$$CLASS_NAME$FromJson(json);
}
嬉しいこと一覧
json_annotation
より気持ちよくJSONコンパチなクラスを書ける
上で若干触れたように、part g.dart
とfromJson
の行を書くだけでfromJsonとtoJsonが使えるようになります
json_annotation
の頃からざっくりコード量が半分ぐらいになる
(さっきも上げましたがComparing freezed to built_valueに詳しい)
copyWithが自動で生える
説明不要!めっちゃ嬉しいですよね
氏の別のパッケージであるstate_notifierとの相性が良いです
Swiftで言うEnum Associated Value, Kotlinで言うSealed Class的なのが使える
説明不要!これだけでリファクタ出来る部分めちゃくちゃありそうです
値を取り出すには、if文でSmart Castするか、下の自動で生えるメソッド群を使います
switch文では使えなさそう(もともとdartのswitch文はとても使いにくいのでどっちでも良い)
- .when
- 付属値を展開したものを引数に取るラムダを持てる。全パターン網羅する
- .maybeWhen
- whenのorElseを書くバージョン
- .map
- 自身をSmart Castしたものを引数に取るラムダを持てる。全パターン網羅する
- .maybeMap
- mapのorElseを書くバージョン
Lateキーワードが使える
getterを生やすのですが、一度使った値を自動でキャッシュしてくれます
freezedはimmutableなクラスとして設計されているので非常にありがたいですね
hashCode/==が自動で生える
嬉しいですね
その他
non-nullableが使える
@required
や通常の引数にnullが渡るとランタイムエラーを吐くようになります
Dart3.0ではNNBDが導入されるかも?という状況で、それを先んじて使えるようにしてみた形ですね
現状だと、静的解析に引っかからないのであまり意識することはないかもしれません
結論
かなり使えそう
とりあえず明日、業務コードでjson_annotation
使ってた部分をリプレイスしてみます