What’s new in Flutter 3.22【日本語訳】

訳者はじめに

FltuterとDartの3ヶ月ごとのバージョンアップに対してブログ記事がありますので、そちらの日本語訳をさせていたただいております。誤訳・改善点があればご連絡いただけると助かります。
こちらはKevin Chisholmさんの「What’s new in Flutter 3.22」の記事を訳しました。
Thank you for your exciting blog every 3 month, Kevin!

はじめに

またまたエキサイティングなFlutter安定版リリースへようこそ!今回は、Flutter 3.22をお届けできることを大変嬉しく思います。WebAssemblyを安定版チャンネルに導入し、Android向けのImpellerに完全なVulkanバックエンドを提供します。これにより、よりスムーズなグラフィックスと大幅なパフォーマンス向上が期待できます。また、新しいウィジェットの状態プロパティ、動的ビューのサイズ変更、改善されたフォームバリデーションによって、ワークフローが簡素化されます。しかし、それだけではありません。Flavor条件付きアセットバンドル、DartのFirebase向けVertex AIのプレビュー、更新されたDevToolsも登場し、皆様の作業がより簡単になります。

前回のアップデートからわずか数ヶ月で、Flutterコミュニティからの驚くべき1595件のプルリクエストがマージされ、37人の新しいコミュニティメンバーが初めてFlutterに貢献しました!

それでは、この最新リリースに含まれる新機能と改良点をすべて発見し、Flutterコミュニティがもたらしたすべての恩恵をお楽しみください!

WebAssembly

Flutter 3.22のリリースにより、Wasmが安定版チャンネルで利用可能になり、パフォーマンスが大幅に改善されました。M1 MacBookでChromeを使用した内部ベンチマークでは、Wonderousアプリのフレームレンダリング時間が平均で2倍、最悪の場合で3倍改善されました。

このような機能強化は、スムーズなフレームレートを維持することが不可欠なアニメーションやリッチなトランジションがあるアプリには不可欠です。Wasmはパフォーマンスのボトルネックを減少させ、よりスムーズなアニメーションやトランジションを実現します。Flutter WebアプリでWasmを使用するには、Dart Wasm のドキュメントFlutter Wasm のドキュメントをご覧ください。詳細な発表は、Flutter at Google I/O ブログ投稿をご覧ください。

Engine

Flutter 3.22では、Flutterアプリケーションを動かすレンダリングエンジンであるImpellerが大幅にアップデートされました。主なハイライトは、より滑らかなグラフィックスとパフォーマンス向上のためのAndroidでのVulkanバックエンドの完成、ブラーエフェクトと複雑なパスレンダリングの継続的な最適化、Impellerを使ったテストのための新しい実験的APIなどです。私たちのロードマップに沿って、iOSからImpellerへの移行を完了し、Androidのサポートを拡大するなど、Impellerの品質とパフォーマンスの向上に取り組んでいます。

Impeller

Vulkan backend feature complete on Android

このリリースで、ImpellerのAndroid向けVulkanバックエンドの機能が完成しました。特に、過去数ヶ月間、チームはfast advanced blendsの実装、FragmentProgram APIによるカスタムフラグメントシェーダーのサポート、PlatformViewのサポート(ただし、small API migrationが必要)、all blur stylesの完全な実装を完了させることに尽力してきました。

Android preview

3.19安定版リリースでは、ImpellerのOpenGLバックエンドの改良をリリースした後、Vulkanサポートの有無にかかわらず、AndroidデバイスでImpellerを試すようユーザーに呼びかけました。この数ヶ月間、OpenGLバックエンドのパフォーマンスを評価し、Vulkanバックエンドに残る作業を見積もった結果、私たちはまずVulkanバックエンドを製品化できるようにすることに力を注ぐことにしました。

Impellerは、シェーダーコンパイルのジャンクの問題を解決します。さらに、我々のベンチマークでは、平均、90パーセンタイル、99パーセンタイルのフレームタイムでレガシーレンダラーを上回っています。したがって、Android上のVulkanバックエンドのパフォーマンスは許容範囲内であると考えます。このリリース(3.22)では、Impellerにオプトインしたアプリは、利用可能な場合はVulkanバックエンドを使用します。将来のリリースでは、これがデフォルトになる予定です。ImpellerをオプトインしたアプリがVulkanをサポートしていないデバイス上で実行されると、Flutterは自動的にOpenGL ES with Skiaを使用するように潔くフォールバックします。何もする必要はありません。将来、OpenGL ESのImpellerバックエンドが製品版として準備が整ったと思われる場合、このフォールバックもImpellerを使用する予定です。

AndroidのImpellerプレビューは3.22安定版サイクルまで続きますので、Flutter開発者の皆さんには最新の安定版にアップグレードしていただき、Impellerが有効のときに気づいた欠点について問題を報告していただくようお願いします。この段階でのフィードバックは、ImpellerがAndroidで成功し、今年後半のリリースで自信を持ってデフォルトのレンダラーにできるようにするために非常に貴重です。Androidハードウェアのエコシステムは非常に多様です。そのため、Impellerに関する最も有益なフィードバックには、問題が発生した特定のデバイスとAndroidバージョンに関する詳細な情報を含める必要があります。

Blur performance improvements

iOSとAndroidの両方に対応したImpellerで、ブラーが再実装された。特に、Skiaと同様の新しいアプローチは、ベンチマークにおいて、ブラーのCPUおよびGPU時間をほぼ半分に短縮している。

下のグラフは、ブラーのパフォーマンスを強調することを意図した病理学的ベンチマークにおいて、iPhone 11デバイス上でのワーストケース、99%-ile、90%-ile、平均フレームのラスタライズ時間とGPUフレーム時間をms単位で示したものです。Impellerのブラーを書き換えた後、バックドロップフィルターブラーのCPUコストとGPUコストの両方がほぼ半分になりました。この改善の規模は、一般的なアプリに表示されるような非病理学的なケースにも当てはまります。

0*mtFyiLoIUSqk_zRB

ブラー性能を強調することを目的とした病理学的ベンチマークにおける、iPhone 11デバイスでの99%-ile、90%-ile、平均フレームラスタライズ時間、およびGPUフレーム時間(単位:ミリ秒)

Stencil-then-Cover

iOSとAndroidのImpellerは、OpenGL Redbookの "Drawing Filled, Concave Polygons Using the Stencil Buffer"の章で説明されているStencil-then-Coverアプローチに基づく新しいレンダリング戦略に移行しました。チームメンバーは、Flutterに適用されるこのテクニックについて、GitHub issue #123671で詳しく議論しました。

このアプローチにより、ラスタースレッドがSVGやLottieアニメーションなどの複雑なパスのテッセレーションをCPUで計算するのに多くの時間を費やしていた問題が解決されました。変更後、複雑なパスを含むフレームでは、合計フレーム時間(CPU上のUIスレッド+CPU上のラスタースレッド+GPU作業)が大幅に短縮されました。ユーザーは、Lottieアニメーションやその他の複雑なパスが、CPU使用率が低く、GPU使用率がわずかに高く、よりスムーズにレンダリングされることに気づくでしょう。

1*1lCd7dBwJ0ab_sieDlQNFw.gif

(左)ロッテのアニメーション。最近のiPhoneのImpellerでは、レンダリングに64ms/フレームのラスター・スレッドCPU時間を要した。(右)Stencil-then-Cover最適化を行った後、同じデバイスで同じアニメーションを表示。ラスター時間は10倍近く速くなっている。

これらの改善には満足していますが、やるべきことはまだあります。他の機会の中で、ポリライン生成がCPUプロファイルで依然として顕著であることを認識しており、この作業をGPUにもシフトすることを調査するつもりです。

New API

まだ実験的ではあるが、flutter testは --enable-impellerフラグを受け付けるようになった。

Framework

Widget state properties

MaterialStateはMaterialライブラリの外に移動され、WidgetStateと改名されました。これはCupertino、Flutterのベースフレームワーク、パッケージ作者が利用できるようにするためです。新しいWidgetStateへの移行の詳細については、migration guideを参照してください。

ビューの動的なサイズ調整

動的ビューサイジングの 機能強化 は、レスポンシブレイアウトを構築する開発者にとって有益であり、様々なデバイススクリーンにおいてより優れたUI適応性を保証します。

フォームバリデーションの改善

FlutterコミュニティメンバーであるSharbelOkzancontributionsのおかげで、Flutter 3.22にはより柔軟なフォームバリデーション方法が追加され、開発者はより堅牢なユーザー入力処理を作成できるようになり、ユーザビリティとセキュリティの両方が強化された。

2DAPIの共変数

2D グラフィック API における型キャストの必要性を減らすことで、開発ワークフローを簡素化し、ゲームや複雑なアニメーションにとって重要なパフォーマンスを向上させます。

Flavor条件付きアセットバンドル

flavors機能を使用している開発者は、特定のフレーバー用にビルドする場合にのみ、個々のアセットをバンドルするように設定できるようになりました。詳しくは、Conditionally bundling assets based on flavorをご覧ください。

Dart パッケージを使用したアセットの変換

ユーザーは、バンドルされるアプリのアセットを変換するために Dart パッケージを設定できるようになりました。詳細については、Transforming assets at built time を参照してください。

Android

Deep linking

ディープリンクはFlutterアプリのユーザーエクスペリエンスを大幅に向上させ、ユーザーをアプリ内の特定のコンテンツにシームレスに誘導するショートカットとして機能し、エンゲージメントを高め、売上を促進します。iOSのユニバーサルリンクとAndroidのアプリリンクは、そのセキュリティとユーザーフレンドリーな性質から非常に推奨されていますが、それらを設定するのは少し難しいかもしれません。

前回のFlutter安定版リリースでは、Androidアプリのウェブ設定のチェックをサポートするDevTools内のディープリンクバリデータツールを紹介しました。このバージョンでは、Androidマニフェストファイル内の設定を確認するのに役立つ新しい機能を追加しました。

このツールの使用方法の詳細については、ディープリンクの検証 をご覧ください。

予測バックジェスチャー

Flutterは、ユーザーが戻るジェスチャー中に前のルートや前のアプリを覗き見ることができる、Androidの今後の予測戻る機能のサポートを追加しました。これはまだAndroidデバイスの機能フラグに隠れていますが、自分で試す方法の詳細はGitHub

Mateerial2 Mateerial2

FlutterツールはGradle、AGP、Java、Kotlinのバージョン要件を強制する

このリリースでは、FlutterツールはGradle、Android Gradle Plugin (AGP)、Java、Kotlinのサポートするバージョンに関するポリシーを強制します。当初、ツールは警告のみを提供する。

現在、サポートされているバージョンの範囲は以下の通りです:

  • Gradle – 7.0.2から現在までを完全にサポート。それ以外の場合は警告を表示
  • AGP – 7.0.0から現在までのバージョンを完全にサポート。それ以外の場合は警告を表示
  • Java – Java 11から現在までの完全にサポート。それ以外の場合は警告を表示
  • Kotlin – 1.5.0から最新まで完全にサポート。それ以外の場合は警告を表示

次のメジャーリリースでは、これらの警告はエラーになり、--android-skip-build-dependency-validationフラグで上書きできる。より一般的に言えば、このツールは、指定されたバージョンの依存関係のサポートを完全に停止する(エラーを生成する)前に、少なくとも1つのリリースで警告を提供します。

この方針は、関連設計仕様で議論されました。コメントやフィードバックはいつでも歓迎します。

AndroidのGradleビルドスクリプトでGradle Kotlin DSLの使用をサポート

Gradle Kotlin DSLがFlutterでサポートされ、従来のGradle Groovy DSLの代替となります。このサポートにより、自動補完、ドキュメントへのクイックアクセス、ソースナビゲーション、コンテキストを考慮したリファクタリングなど、より良いコード編集体験が可能になります。

この初期サポートはGitHubユーザーbartekpaciaによって提供されました。開発者はGradleのビルドスクリプトをKotlinで書き換えて、これらの利点を利用することができる。

詳細はbartekpaciaによるPR 140744をチェックしてほしい。

プラットフォームビューの改善

Flutterアプリ開発者の皆さんへお知らせです!Flutterを使ってネイティブのAndroidコンポーネント(マップ、ウェブビュー、特定のUI要素など)に依存するアプリを構築している場合、重要なお知らせがあります。

Android 14のバグのため、古いバージョンのFlutterで作られたアプリは、この新しいAndroidバージョンを実行しているデバイスでは正しく動作しない可能性があります。

Flutter 3.22はこの問題を修正し、Androidアプリのこれらのネイティブコンポーネントの全体的なパフォーマンスを改善します。そのため、あなたのアプリがすべてのAndroidデバイスでスムーズに動作するように、Flutter 3.22でアプリを再構築してリリースするようにしてください。

このアップデートには、Android上のプラットフォームビューの信頼性とパフォーマンスを全体的に向上させるための舞台裏の改善も含まれています。

KitKatのサポート終了

Flutterの最小サポートAndroidバージョンはLollipop(API 21)になりました。Flutterの3.22安定版リリースから、FlutterはAndroid KitKat (API 19)を搭載したデバイスでは動作しなくなります。詳しくはdeprecation guideをご覧ください。

iOS

プラットフォームビューのパフォーマンス

iOSのプラットフォームビューのパフォーマンスが多くのFlutter開発者にとっての悩みの種であることは理解しています。これは特に、プラットフォームビューを使用する際のスクロールビューで顕著でした。

最近のアップデートはこれらの懸念に直接対応し、記事内に複数のインライン広告を埋め込むようなシナリオで大幅に改善されました。以下は、私たちのベンチマークにおける主な改善点です:

  • GPU使用量の削減:**GPU使用量が50%削減され、消費電力が削減され、ユーザー体験がよりスムーズになる可能性があります。
  • フレームレンダリングの改善: **平均フレームレンダリング時間が1.66ms (33%)減少しました。
  • ジャンクの最小化: **最悪の場合のフレームレンダリング時間は3.8ms(21%)短縮されました。

スクロール・ビュー内で複数のプラットフォーム・ビュー(広告、地図など)を使用する際にパフォーマンス上の問題を経験していた場合、これらの最適化により、より流動的で応答性の高いスクロール体験が可能になります。ぜひお試しいただき、ご意見をお聞かせください。

0*uk0URkHcImHdTq2M0*-KX8Ubw77KpdGnPI

Ecosystem

Vertex AI for Firebase Dart SDK プレビューリリース

Vertex AI for Firebase 製品がパブリックプレビューにリリースされ、Dart SDK が含まれるようになりました。これにより、Gemini APIを使用して、DartまたはFlutterアプリ用のジェネレーティブAI機能を構築することができます。SDKはFirebase App Checkと統合されており、APIコールを保護し、課金詐欺、フィッシング、アプリのなりすましなどの深刻な脅威からバックエンドインフラを保護します。プロモコードを入力して、Getting Started for Dartに飛び込み、無料で使い始めることができます。

0*KmIhzrfoyskNW7r8

Google AI Dart SDK*は引き続き利用可能であり、プロトタイピングのみに使用することを推奨する。Google AIには、無料アクセス(制限内および利用可能な場合)と従量課金があります。Google AI Dart SDKでプロトタイピングを行い、Vertex AI for Firebaseに移行する場合は、移行ガイドをご覧ください。

DevToolsのアップデート

DartとFlutterのパフォーマンスとデバッグツールのスイートであるDevToolsの改善を続けています。このリリースには、パフォーマンスの改善、全般的な改良、そしてCPUサンプルをタイムラインに含める、高度なフィルタリング、メモリスナップショットのインポートとエクスポートのサポートなどの新機能が含まれています。

他の注目すべき改善は、DevTools 拡張作者をサポートする devtools_extensions と devtools_app_sharedpackages で出荷されました。新しい Dart Tooling Daemon (DTD) にエクステンションを接続するためのサポートを追加しました。これにより、DevTools エクステンションは IDE などの他の DTD クライアントによって登録されたパブリックメソッドにアクセスできるようになり、開発プロジェクトと対話するための最小限のファイルシステム API にアクセスできるようになります。

Flutter 3.22に含まれるすべてのアップデートの詳細については、DevTools 2.32.02.33.02.34.1のリリースノートをご覧ください。

Google Mobile Ads SDK for Flutter

Flutterアプリを広告でマネタイズしている方に嬉しいお知らせです: Google Mobile Ads for Flutterがバージョン5.0.1にメジャーアップデートしました!

**User Messaging Platform (UMP) SDKのサポートを強化しました: **このアップデートにより、Android UMP SDKバージョン2.2.0とiOS UMP SDKバージョン2.4.0の最新APIがサポートされます。UMP SDKは、プライバシー規制を遵守し、パーソナライズされた広告に対するユーザー同意の取得を容易にするために非常に重要です。この新バージョンでは、同意収集プロセスを簡素化するために、いくつかの新しいAPIが導入されています。

**拡張されたメディエーションパートナー:**私たちは、UnityMetaAppLovinIron SourceMintegralを含む人気の広告パートナーとの統合を提供することで、広告収益化の視野を広げました。 dev/packages/gma_mediation_mintegral)、PangleDT ExchangeInMobiLiftoff.メディエーションオプションの拡張と実装の簡素化により、アプリの収益を最大化できるようになりました。

あなたのFlutterアプリでこれらの新機能をお試しいただき、私たちにサポートしてほしい他のメディエーションパートナーをお知らせください。Google Mobile Ads SDK for Flutterの強化を続けていく上で、皆様からのフィードバックは非常に貴重です。

破壊的変更と非推奨事項

ColorScheme.fromSeed

ColorScheme.fromSeedで使用されるシードカラーの彩度値が高い場合、出力されるColorSchemeはパステル調のパレットになり、鮮やかさに欠けることがあります。出力カラーがシードカラーの意図した感じに近いことを確認するには、dynamicSchemeVariantDynamicSchemeVariant.fidelityまたはDynamicSchemeVariant.contentに設定することを検討してください。これらのオプションは、元のシードカラーにより近いパレットを生成します。

Android埋め込みv1の削除

Androidエンベッディングのバージョン1の削除が進行中です。以下のように、ほとんどのアプリに影響はないでしょう。

  1. バージョン2が長年デフォルトであった

  2. Flutterツールは、特にignore-deprecationフラグで上書きしない限り、すでにバージョン1のアプリのビルドをブロックしている。

今回のリリースでは、Flutterツールによるバージョン1アプリのサポートは完全に打ち切られます。**オーバーライドすることはもはや不可能です。

プラグイン作者の方はご注意ください: v1のAndroid埋め込みが最初に非推奨になったとき、プラグイン作者のために移行ドキュメントがhttps://docs.flutter.dev/release/breaking-changes/plugin-api-migrationに書かれました。この移行の一環として、プラグイン作者は、Plugin.javaに以下の署名を持つメソッドを含めることで、v1エンベッディングを使用するアプリのサポートを維持することが推奨されました。

public static void registerWith(@NonNull io.flutter.plugin.common.PluginRegistry.Registrar registrar)

次のリリースでは、v1のAndroidエンベッディングを完全に削除する予定です。その時点で、このシグネチャを持つメソッドを含むプラグインはコンパイルされなくなります(v1のandroidエンベッディングの型を参照しているため)。

このリリースでは、v1エンベッディングを使用しているアプリが壊れてしまったためです。Flutterの将来のバージョンでの不具合を避けるため、プラグインの作者はできるだけ早くv1のコードを削除したプラグインの更新版をリリースすることを推奨します。例として、PR 6494をチェックしてください。これはFlutterチームによってメンテナンスされているプラグインを削除したものです。

3.22で削除された非推奨事項

このリリースのBreaking changesには、v3.19のリリース後に期限切れとなった非推奨APIが含まれています。影響を受けるすべてのAPIを、追加のコンテキストと移行ガイダンスとともに見るには、このリリースのための非推奨ガイドを参照してください。これらの多くはFlutter fixでサポートされており、IDEでのクイックフィックスも含まれています。一括修正はdart fixcommand-lineツールで評価・適用できます。

いつものように、contributing testsのコミュニティに感謝します。詳しくはFlutterの変更ポリシーをご覧ください。

まとめ

Flutterの成功の中心はあなた、つまり私たちの素晴らしいコミュニティです。皆さんの数え切れないほどの貢献と揺るぎない情熱なくして、このリリースはあり得ませんでした。心から感謝します。

Flutter 3.22を試す準備はできましたか?全リリースノートと変更履歴に飛び込んで、ターミナルを起動し、flutter upgradeを実行してください。私たちは、あなたが何を作るか見るのが待ちきれません!