SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Flutterで始めるモバイルアプリ開発

Flutter3へのアップグレードでどう変わる?――注目の新規機能と重要な変更点を解説

Flutterで始めるモバイルアプリ開発 第20回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Dart2.17での変更点

 Flutter3ではDartのバージョンが2.17になり、以下の機能が追加されています。開発者にとっては、Flutter3へバージョンアップして最初に恩恵を得る部分が、この部分ではないでしょうか。

  • Enumでのメンバ変数機能
  • コンストラクタでのsuperを使った初期化
  • メソッドでの名前付き引数の宣言の緩和

 また、既存のプロジェクトでDart2.17を利用する場合には、リスト4のようにpubspecファイルを変更する必要があります。

[リスト4]pubspec.yamlでのDart2.17対応
environment:
  sdk: ">=2.17.1 <3.0.0"

Enumでのメンバ変数機能

 これまでEnumの定義はリスト5のように非常に簡単な定義しかできませんでした。

[リスト5]pubspec.yamlでのDart2.17対応
enum Account {
  student,
  parent,
  staff;
}

 Dart 2.17からはリスト6のようにEnumにメンバ変数を定義できるようになりました。

[リスト6]pubspec.yamlでのDart2.17対応
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を使った場合のコンストラクタの例です。

[リスト7]コンストラクタ時の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を使うことでより基底クラスとの関係性もわかりやすくなります。

メソッドでの名前付き引数の宣言の緩和

 これまで、名前付き引数は、定義と同じように通常の引数のあとに記述する必要がありました。しかし、この制限がなくなり、呼び出しに際して名前付き引数をどこに記述してもよくなりました。

[リスト8]名前付き引数の宣言と実行例
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については、コンポーネントなどを含めてすべての対応が終了しているわけではないので、実際の利用はもう少し先になるのではないかと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Flutterで始めるモバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15997 2022/06/13 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング