95
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flutter freezedパッケージいい感じかも

Last updated at Posted at 2020-03-09

providerパッケージの作者であるRemi Rousseletさんが先月リリースした
freezedパッケージが日本のFlutter界隈でも話題になっていますね

ざっと触ってみたのでメモします

使い方

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.dartfromJsonの行を書くだけで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使ってた部分をリプレイスしてみます

95
58
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
95
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?