classは、関連するデータ(プロパティ)と処理(メソッド)をまとめる設計単位です。FlutterではWidgetやAPI結果を表すModelがすべてclassでできており、Mapのまま扱うより安全で読みやすくなります。classとセットで使うコンストラクタも合わせて押さえましょう。
この記事の結論
classでデータと処理をまとめ、コンストラクタで初期値を渡してインスタンスを作ります。Flutterでは名前付き引数とrequiredを使うコンストラクタが基本形なので、この形に慣れるとWidgetもModelも読みやすくなります。
classを定義する
プロパティとメソッドをまとめます。値を変えない項目はfinalにしておくと安全です。
class User {
User(this.name, this.age);
final String name;
final int age;
String label() => "$name ($age)";
}
インスタンスを作る
classから実際の値を持つオブジェクト(インスタンス)を作り、プロパティやメソッドを使います。
final user = User("Sato", 28);
print(user.label()); // Sato (28)
コンストラクタで初期値を渡す
コンストラクタはインスタンス生成時に初期値を受け取る仕組みです。短いclassではthisを使うと簡潔に書けます。
class Point {
Point(this.x, this.y);
final int x;
final int y;
}
final p = Point(10, 20);
名前付き引数とrequired
引数を{}で囲むと名前付き引数になり、呼び出し側で引数名が見えるので間違えにくくなります。必須の項目にはrequiredを付けます。FlutterのWidgetはこの形が標準です。
class Post {
Post({required this.title, required this.body});
final String title;
final String body;
}
final post = Post(title: "Hello", body: "Dart");
デフォルト値を指定する
名前付き引数には省略時の値を設定できます。省略できる設定項目に向きます。
class ButtonConfig {
ButtonConfig({this.enabled = true});
final bool enabled;
}
FlutterのModelにする
API結果や画面データをModelクラスへ変換すると、型の恩恵を受けられて保守しやすくなります。
class Article {
Article({required this.id, required this.title});
final int id;
final String title;
}
実装後に確認すること
- 変更しない項目をfinalにしているか
- 必須の引数にrequiredを付けているか
- Mapのまま扱っている箇所をModelへ置き換えられないか検討したか
- Flutter WidgetやModelでコンストラクタの形を説明できるか
よくあるつまずき
- 名前付き引数にrequiredを付けず、nullで落ちる
- すべてvar/dynamicにして型の恩恵を捨てる
- コンストラクタでthisの初期化を書き忘れる
- API結果をMapのまま引き回し、キー名のtypoで気づけない
次に読む記事
- Dartのデータ型|int・double・String・bool・null安全を初心者向けに解説 — Dartの基本データ型を初心者向けに解説します。int、double、String、bool、List、Map、null安全、型推論の使い分けを確認します。
- Dart Mapの使い方|キーと値・JSON風データの基本 — DartのMapを初心者向けに解説します。キーと値、追加、取得、containsKey、APIレスポンスを扱う前提を整理します。
- Dart async awaitの使い方|Futureを順番に待つ基本を初心者向けに解説 — Dartのasync/awaitを初心者向けに解説します。Futureとthenの関係、awaitで待つ書き方、try-catch、Future.wait、Flutterでローディング表示につなげる考え方を整理します。
まとめ
Dart classの使い方は、プロパティ・メソッド・コンストラクタの3点で理解できます。名前付き引数とrequiredに慣れれば、FlutterのWidgetやModelがぐっと読みやすくなります。Mapで扱っているデータはModel化を検討しましょう。