Open3

フラッターメモ

よよよよよよ

freezed

Dartで「イミュータブルなクラス」「コピー」「比較」「パターンマッチング(when)」を自動生成してくれるパッケージ。

なぜ使うか?

Dartでモデルクラスや状態クラスを書くとき、毎回

・==演算子のオーバーライド↓
クラスのインスタンス同士を比較するときに、「自分で比較のルールを定義する」こと
・copyWith()の定義↓
「既存のインスタンスをベースに、一部のプロパティだけ変更した新しいインスタンスを作る」ためのもの
・toString()の実装↓
オブジェクトの内容をわかりやすく文字列として出力するために使われるメソッドです。デバッグ中にログ表示したり、オブジェクトの状態を見たいときに便利です。
・パターン分岐(when)↓
sealed class(密閉型クラス)で定義された複数の状態に対して、それぞれのケースで何をするか明示的に書けるメソッド
→それを**@freezed って1つ書くだけで全部自動生成**してくれる

コードさんぷる

freezedあり


class CounterState with _$CounterState {
  const factory CounterState({required int count}) = _CounterState;
}
final state1 = CounterState(count: 0);
final state2 = CounterState(count: 0);

print(state1 == state2); // true!(内容で比較してくれる)

freezedなし(手書き)

class CounterState {
  final int count;
  CounterState({required this.count});
}

final state1 = CounterState(count: 0);
final state2 = CounterState(count: 0);

print(state1 == state2); // false(インスタンスが違うから)

//使いながら深掘り

よよよよよよ

データ構造(モデルクラス)の基本構成

class User {
  final int id;
  final String name;

  User({required this.id, required this.name});

Dartで普通にデータを保持するクラス

copyWith()の実装

class User {
  final int id;
  final String name;

  User({required this.id, required this.name});

  User copyWith({int? id, String? name}) {
    return User(
      id: id ?? this.id,
      name: name ?? this.name,
    );
  }
}
//copyWithをつけることで,User という既存のインスタンスの name だけを変更した新しいインスタンスを作ることができる
final user1 = User(id: 1, name: "太郎");

// 名前だけ変えた新しいUserを作成
final user2 = user1.copyWith(name: "花子");

print(user2.name); // 花子
print(user2.id);   // 1(変わらない)

/hasCodeを自分で実装する(比較できるようにする)


bool operator ==(Object other) {
  return identical(this, other) ||
    other is User &&
    runtimeType == other.runtimeType &&
    id == other.id && name == other.name;
}
//==(等価演算子)をオーバーライドして、2つのUserインスタンスが「中身が同じかどうか」を比較できるようにしている

//あとでやる