Dart2.17での変更点
Flutter3ではDartのバージョンが2.17になり、以下の機能が追加されています。開発者にとっては、Flutter3へバージョンアップして最初に恩恵を得る部分が、この部分ではないでしょうか。
- Enumでのメンバ変数機能
- コンストラクタでのsuperを使った初期化
- メソッドでの名前付き引数の宣言の緩和
また、既存のプロジェクトでDart2.17を利用する場合には、リスト4のようにpubspecファイルを変更する必要があります。
environment: sdk: ">=2.17.1 <3.0.0"
Enumでのメンバ変数機能
これまでEnumの定義はリスト5のように非常に簡単な定義しかできませんでした。
enum Account { student, parent, staff; }
Dart 2.17からはリスト6のようにEnumにメンバ変数を定義できるようになりました。
enum Account { student('stu'), parent('pat'), staff('stf'); final String accountType; const Account(this.accountType); @override String toString() { return "Account type is $accountType}"; } }
これでEnumの値などをデバッグ時に理解しやすくなりました。
コンストラクタでのsuperを使った初期化
クラスを継承した際にsuperを使ってコンストラクタの記述をより簡略化できるようになりました。以下は、既存のコンストラクタとsuperを使った場合のコンストラクタの例です。
// (1) クラスの定義 class Sample{ String label1; String label2; Sample({ required this.label1, required this.label2 }); } // (2) Dart2.17以前の記述方法での継承クラスの定義 class Hoge1 extends Sample{ Hoge1( { required String label1, required String label2 }) : super ( label1: label1, label2: label2 ); } // (3) Dart2.17以降の記述方法での継承クラスの定義 class Hoge2 extends Sample{ Hoge2({ required super.label1, required super.label2 }); }
(1)が継承されるクラスの定義です。このクラスを継承したクラスを定義する場合に、これまでは(2)のように何度も同じ変数名を定義していました。しかし、Dart2.17以降では(3)のようにsuperを使うことで基底クラスの変数名を重複して記述する必要はなくなります。
今回のサンプルクラスではコンストラクタで指定している変数が少ないので、そこまで冗長と感じないかも知れませんが、Flutterはコンストラクタで必要な変数が多いケースがよくあります。その場合に記述しやすいと同時に、短いコードでもsuperを使うことでより基底クラスとの関係性もわかりやすくなります。
メソッドでの名前付き引数の宣言の緩和
これまで、名前付き引数は、定義と同じように通常の引数のあとに記述する必要がありました。しかし、この制限がなくなり、呼び出しに際して名前付き引数をどこに記述してもよくなりました。
void sample(int size, { required String label1 , required String label2 } ){ print(size); print(label1); print(label2); } main(){ // (1) Dart2.17以前の実行 sample(10, label1: 'test1', label2: 'test2'); // (2) Dart2.17以降の実行 sample(label1: 'test1', label2: 'test2', 10); sample(label2: 'test2', 10 , label1: 'test1'); }
(1)がDart2.17以前の実行例です。通常の引数であるsizeは、必ず最初に記述する必要があります。それ以降の名前付き引数の順番は問いません。しかし、Dart2.17以降から(2)のようにこの順番が自由にできます。
Flutterではコンストラクタやメソッド内の引数で定義を記述することが多いため、引数の記述がどうしても長くなりがちです。そのような場合に、より見やすいように順番を変えたくなることがありますが、そのような要望に応えることができるようになりました。
その他のリリース内容
今回、Flutter3の発表では具体的な内容については詳細に紹介されていませんでしたが、以下の内容については今後のFlutterの方向性などを想像するための参考になると思っています。
- Firebaseサービスとの結合強化
- カジュアルゲームを作成するためのGames Toolkitのリリース
まず、FirebaseはGoogleのサービスです。また、FlutterもGoogleが主導しているプロジェクトです。これらのことから、よりGoogle内でFlutterが重要な位置付けと変わってくることが予想できます。Firebase Crashlyticsのようなアプリの問題把握ツールと連携を高めることで、Flutterアプリの運用を助けてくれることでしょう。
そして、カジュアルゲームの例示として今回の発表ではPinBallを公開しました。また、Flameというゲームエンジン用のオープンソースもあり、ゲームへの期待も高まっています。
Flutterは今まで階層型のUIツールのフレームワークという印象が強くありましたが、ゲームのようなアプリケーションが作れるということはより細かい単位の部品を扱うための仕組みが強くなるはずです。また、ゲームは作らないという場合であっても、最近のアプリではゲーミング要素を取り入れることが多いため、今までネイティブでないとできないと思っていたこともFlutterでできる範囲が広がると思います。
まとめ
Flutter3へのバージョンアップといっても、実際の変更内容を一つひとつ見るとそれほど大きな変更ではないという印象です。また、既存プロジェクトには影響を与えないようなアップグレードであるため、バージョンを上げること自体は問題なく可能です。
一方、Flutter3でのMaterial Design 3を使う場合、利用者の見た目にかかわるUI部分の変更は小さくとも、内部的には大きな影響と感じる方もいるはずです。Material Design 3については、コンポーネントなどを含めてすべての対応が終了しているわけではないので、実際の利用はもう少し先になるのではないかと思います。