Flutter

Dart classの使い方|プロパティ・メソッド・コンストラクタの基本

Dartのclassを初心者向けに解説します。プロパティ、メソッド、インスタンス、コンストラクタ(thisと名前付き引数、required、デフォルト値)、FlutterでModelを作る流れまでを整理します。

この記事の目次
  1. この記事の結論
  2. classを定義する
  3. インスタンスを作る
  4. コンストラクタで初期値を渡す
  5. 名前付き引数とrequired
  6. デフォルト値を指定する
  7. FlutterのModelにする
  8. 実装後に確認すること
  9. よくあるつまずき
  10. 次に読む記事
  11. まとめ

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 classの使い方は、プロパティ・メソッド・コンストラクタの3点で理解できます。名前付き引数とrequiredに慣れれば、FlutterのWidgetやModelがぐっと読みやすくなります。Mapで扱っているデータはModel化を検討しましょう。