この記事について
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形式にする場合はこのように書く