Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
53
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@_masaokb

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

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使ってた部分をリプレイスしてみます

53
Help us understand the problem. What is going on with this article?
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
53
Help us understand the problem. What is going on with this article?