LoginSignup
2
1

Flutter 学習メモ Dart 編

Posted at

この記事について

Flutter の開発で利用される言語・Dart に関する覚え書きです。
全体的に JavaScript/TypeScript と同じような感覚でコーディングが可能で、比較的覚えやすい言語ではありますが、一部書き方に迷った部分がありました。

環境情報

  • OS: Mac OS 12.6.5
  • Dart: 2.19.0

コンストラクタ

コンストラクタは、クラスの初期化時に実行される処理です。
Dart には複数の種類のコンストラクタがあり、通常のコンストラクタだけでも様々な書き方ができます。

その他のコンストラクタについては、公式を参考にしてください。

通常のコンストラクタ

引数で初期値を受け取り、インスタンス変数に設定する方法です。Java のコンストラクタと似た書き方となります。

class Employee {
  String name = '';
  int age = 0;

  Employee(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

省略形

コンストラクタの処理部分を省略することができます。

class Employee {
  String name;
  int age;

  Employee(this.name, this.age);
}

名前付き引数

コンストラクタでも、名前付き引数が使用できます。必須(required)かどうかの指定もできます。

class Employee {
  String name;
  int? age;

  Employee({required this.name, this.age});
}

void main() {
  var employee = Employee(name: 'Taro');
  print(employee.age); // Taro
}

初期化処理を続けて記載

コンストラクタの直後にコロンを記載し、初期化処理を続けて記載することも可能です。
複数の項目の初期化をする場合は、カンマで区切ります。

class Employee {
  final String _name;
  final int _age;

  Employee({required name, int age = -1}): _name = name, _age = age;

  // getter
  String get name => _name;
  int get age => _age;
}

void main() {
  var employee = Employee(name: 'Jiro', age: 31);
  print(employee.name); // Jiro
  print(employee.age); // 31
}

変数宣言

varを使うと、代入可能な変数が宣言できます。JavaScript でいうletと同様です。

  var moji = '初期値';
  moji = '変更後';
  print(moji);  // 「変更後」が出力される

データ型を指定すると、varが不要になります。

  String moji = '初期値';
  moji = '変更後';
  print(moji);  // 結果は上記の例と同じ

dynamicで変数宣言すると、データ型を制限しない変数となります。JavaScript でいうanyに近いです。
あまり多用しない方が良いでしょう。

  dynamic val = '初期値';
  val = 1000;
  print(val); // 「1000」が出力される

const と final キーワード

constキーワードを設定可能な箇所で const を省くと、「パフォーマンス向上のために const を使ってね」と lint が警告をしてきます。

Use 'const' with the constructor to improve performance.
Try adding the 'const' keyword to the constructor invocation.`

constの指定が推奨される例

  appBar: AppBar(
    title: const Text('ホーム'),  // 不変な値のため、constが指定可能
  ),

constの指定ができない例

  final String title = '${DateTime.now().day}日の登録データ';
  (中略)
  appBar: AppBar(
    title: Text(title),  // 実行するまで値が決まらないため、constは指定不能
  ),

Dart ではfinalキーワードも使用可能であり、constとは以下のような違いがあります。

  • const: コンパイル時点で値が確定しており、再代入や内包する要素の変更は一切できない(静的な要素にのみ用いる)
  • final: 再代入を禁じるのみであり、要素の変更は可能

finalの方が制限が穏やかであり、JavaScript で使用されるconstに近い感覚です。

プログラムの変更によって const が指定できない状態になるとコンパイルエラーが起きるため、const キーワードは外さなければなりません。
そのことに気づかずエラーの原因に悩まされたこともあったため、少し注意が必要です。

Dart では"できない"書き方

JavaScript と同じ感覚で書こうとすると、Dart ではエラーとなる書き方もあります。

分割代入

一括してプロパティを取得することはできないため、1 つずつ取り出さざるを得ないようです。

const data = {'a': 'val1', 'b': 'val2'};
// final { a } = data; このような書き方は不可
final a = data['a'];

value の省略

キー名と変数名が同じ場合、JavaScript では value 部分を省略することがよくあります。

しかし Dart では、波括弧に変数だけを入れると、 Set 型変数の定義となってしまいます。

  const title = 'タイトル';
  const value = '表示値';

  const setData = {title, value}; // この定義方法だとSetになる
  const mapData = {'title': title, 'value': value}; // key-value形式にする場合はこのように書く
2
1
4

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
2
1