What’s new in Flutter 3.19[日本語訳]

訳者 はじめに

Kevin Chisholmさんによる「What’s new in Flutter 3.19」(原文)の日本語訳です。気がつけば4回目。勝手に訳して、後から許可を取ります(笑)

はじめに

本日、Flutterの新しいリリース、Flutter 3.19をお届けする。このリリースでは、Gemini用の新しいDart SDK、ウィジェットのアニメーションにきめ細かなコントロールを追加できるウィジェット、Impellerのアップデートによるレンダリングの向上、ディープリンクの実装を支援するツール、Windows Arm64のサポートなど、多くの機能が追加された!

AIの統合

Gemini Google AI Dart SDKベータリリース

Google AI Dart SDKがベータ版としてリリースされました。これにより、Gemini(Googleの最新のAIモデルファミリー)を搭載したDartまたはFlutterアプリにジェネレーティブAI機能を組み込むことができます。pub.devにはgoogle_generative_aiパッケージがあります。Google AI Dart SDKでの構築方法については、このブログ投稿を参照するか、Dartクイックスタートに直接進んでください。

フレームワーク

スクロールの改善

Flutterでは以前、2本の指でドラッグするとスクロール速度が2倍になっていました。これをMultiTouchDragStrategy.latestPointerを使用してデフォルトのScrollBehaviorを設定することで、指の数に依存しないスクロール動作を実現できるようになりました。この変更の詳細については、移行ガイドを参照してください。また、SingleChildScrollViewReorderableListのバグ修正を完了し、報告された多数のクラッシュと予期しない動作を解決しました。

二次元スクロール

二次元スクロールでは、どちらかの方向でスクロールが進行中にドラッグまたはタップすると、スクロール動作が期待どおりに停止するようになりました。TableViewウィジェットも最後の安定版リリース3.16以降で更新され、より多くの新機能を取り入れ、マージセルのサポートを追加し、2D基盤の新機能をより多く採用しました。

AnimationStyle

Flutterコミュニティメンバー@TahaTesser貢献により、Flutterには新しいAnimationStyleウィジェットが追加されました。これにより、開発者はMaterialAppExpansionTilePopupMenuButtonなどのウィジェットのデフォルトのアニメーション動作を上書きできるようになります。

SegmentedButton.styleFrom

Flutterコミュニティメンバー@AcarFurkanが、他のボタンタイプに提供されているものと同様のstyleFrom静的ユーティリティメソッドを追加しました。このメソッドを使用すると、SegmentedButtonのButtonStyleを迅速に作成し、他のSegmentedButtonと共有するか、アプリのSegmentedButtonThemeを設定することができます。

Adaptive Switch

このAdaptiveコンポーネントは、macOSとiOSではネイティブの外観と感触を持ち、他の場所ではMaterial Designの外観と感触を持ちます。Cupertinoライブラリに依存しないため、すべてのプラットフォームでAPIがまったく同じです。

Adaptive Switchのプルリクエストと、Switch.adaptiveコンストラクタAPIページのライブサンプルを参照のこと。

セマンティックプロパティのアクセシビリティ識別子

SemanticsPropertiesに新しいアクセシビリティ識別子が追加され、ネイティブのアクセシビリティ階層でセマンティックノードを識別します。Androidでは、アクセシビリティ階層でresource-idとして表示されます。iOSでは、これによりUIAccessibilityElement.accessibilityIdentifierが設定されます。コミュニティメンバー@bartekpaciaエンジンフレームワークにまたがるこの変更に感謝します。

テキストウィジェット状態へのアクセスの向上

TextFieldTextFormFieldMaterialStatesControllerのサポートを追加しました。これにより、MaterialStateの変更をリッスンできるようになります。

UndoHistoryスタック

日本語キーボードでundo/redoの履歴が消える問題修正しました。エントリをUndoHistoryスタックにプッシュする前に修正できるようになりました。

エンジン

Impellerの進捗

Android OpenGLプレビュー

3.16の安定版リリースで、Vulkanを有効にしたAndroidデバイスのユーザーにImpellerの試用を呼びかけました。これにより、市場に出回っているAndroidデバイスの77%をカバーしています。過去数ヶ月間で、ImpellerのOpenGLバックエンドをVulkanバックエンドと機能的に同等にするための作業を行いました。例えば、MSAAのサポートを追加するなどしています。これにより、FlutterアプリはほぼすべてのAndroidデバイスで正しくレンダリングされることが期待されますが、カスタムシェーダーや外部テクスチャの完全なサポートなど、まだ対応していない機能がいくつかあります。

Flutter開発者には、最新の安定版にアップグレードし、Impellerが有効になっている場合に観察される問題について報告することをお願いしています。この段階でのフィードバックは、ImpellerがAndroidで成功することを確実にし、今年後半にデフォルトのレンダラーとして採用できるようにするために非常に貴重です。AndroidのハードウェアエコシステムはiOSのそれよりもはるかに多様です。そのため、Impellerに関する最も役立つフィードバックには、問題が発生した具体的なデバイスとAndroidバージョンに関する詳細情報が含まれるべきです。

さらに、リマインダーとして、ImpellerのVulkanバックエンドは、Skiaを使用した場合と比較して、デバッグビルドで追加のデバッグ機能を有効にしますが、これらの機能には追加のランタイムオーバーヘッドがあります。そのため、Impellerのパフォーマンスに関するフィードバックを提供する際には、プロファイルビルドまたはリリースビルドからのものであることが重要です。バグレポートには、DevToolsからのタイムラインと、同じデバイス上でのSkiaバックエンドとの比較が含まれるべきです。最後に、常に、問題を示す小さな再現可能なテストケースを含むフィードバックに非常に感謝しています。

ロードマップ

レンダリングの忠実度の後、ImpellerのAndroidプレビュー期間における主な焦点はパフォーマンスです。私たちは段階的な改善を続けていますが、いくつかの大きな改善も進行中です。Vulkanサブパスを活用する作業が、高度なブレンドモードのパフォーマンスを大幅に向上させることが期待されます。さらに、CPU上で常にすべてのパスをテッセレーションするというレンダリング戦略から、ステンシル・ゼン・カバー方式への変更も、AndroidとiOSの両方でImpellerのCPU使用率を大幅に削減することが期待されます。最後に、ガウスぼかしの新しい実装がSkia実装のスループットに匹敵し、iOSでのぼかしの慣用的な使用を改善することが期待されます。

APIの改善

グリフ情報

このリリースでは、dart:uiParagraphオブジェクトに2つの新しいメソッド、getClosestGlyphInfoForOffsetgetGlyphInfoAtが追加されました。これらはそれぞれ、新しいタイプのGlyphInfoオブジェクトを返します。新しいGlyphInfoタイプに関するドキュメントをチェックしてください。

GPUトレーシング

ImpellerがMetal(iOS、macOS、Simulator)およびVulkanを有効にしたAndroidデバイスで動作している場合、Flutterエンジンは現在、デバッグビルドとプロファイルビルドのタイムラインで各フレームのGPU時間を報告します。GPUフレームタイミングはDevToolsの「GPUTracer」ヘッダーの下で検査できます。

Vulkanを使用していないAndroidデバイスがGPUタイミングのクエリサポートを誤って報告する可能性があるため、これらのデバイスでImpellerのGPUトレーシングを有効にするには、AndroidManifest.xmlファイルにフラグを設定する必要があります。

<meta-data android:name="io.flutter.embedding.android.EnableOpenGLGPUTracing" android:value="true" />

パフォーマンスの最適化

特殊化定数

チームはImpellerに特殊化定数のサポートを追加しました。Impellerのシェーダーでこの機能を利用することで、Flutterエンジンの非圧縮バイナリサイズを約350KB削減しました。

バックドロップフィルターの高速化

まだ多くの作業がありますが、このリリースにはImpellerのバックドロップフィルターとぼかしに関するいくつかの良いパフォーマンス改善が含まれています。特に、オープンソースの貢献者@knoppは、Impellerが誤ってオンスクリーンテクスチャからの読み取り機能を要求していることに気づきました。この機能を削除することで、複雑さに応じて、複数のバックドロップフィルターを含むシーンがベンチマークで20〜70%改善されました。

さらに、Impellerはもはやすべてのバックドロップフィルターに対して無条件にステンシルバッファを保存することはありません。代わりに、クリップに影響を与える操作が記録され、バックドロップフィルターのセーブレイヤーを復元する際に新しいステンシルバッファに再生されます。

この変更により、Vulkanバックエンドを使用してImpellerで実行されるPixel 7 Pro上でのアニメーションされた高度なブレンドモードのベンチマークは、平均GPUフレーム時間が55msから16msに改善され、90パーセンタイルのラスタースレッドCPU時間が約110msから22msに改善されました。

Android

ディープリンクWebバリデータ

開発者から学んだことによると、Web URLからモバイルアプリの特定のページにユーザーを導くディープリンクの実装は常に難しく、エラーが発生しやすいものでした。そこでまず、リンクが誤って設定されているかを理解し、実装のガイダンスを提供するための検証ツールを作成しました。Flutterディープリンクバリデータの初期バージョンを共有できることを非常に嬉しく思います!

この初期バージョンでは、FlutterディープリンクバリデータはAndroid上でのWebチェックをサポートしており、これはあなたのassetlinks.jsonファイルの設定を検証することを意味します。DevToolsを開き、Deep Linksタブにクリックし、ディープリンクを含むFlutterプロジェクトをインポートすることができます。ディープリンクバリデータは、Webファイルが正しく設定されているかどうかを教えてくれます。詳細については、ディープリンク検証ツールのテスト手順を参照してください。

このツールがディープリンク実装の旅を簡素化する最初のステップであることを願っています。iOS上でのWebチェックおよびiOSとAndroidの両方でのアプリチェックに対する将来のサポートを提供するために作業を続けます!

Share.invokeのサポート

以前はAndroidのテキストフィールドやビューにデフォルトのShareボタンが欠けていましたが、このリリースで追加されました。これは、各プラットフォームでデフォルトのコンテキストメニューボタンが利用可能であることを確実にするための継続的な取り組みの一環です。この継続的な作業はPR #107578でフォローできます。

ネイティブアセット機能

Flutterコード内の他の言語の関数との相互運用性に興味がある場合、ネイティブアセットを通じてAndroidでFFI呼び出しを行うことができるようになりました。これは、ネイティブアセットをサポートするための継続的な作業の一環です。

Texture Layer Hybrid Composition (TLHC) モード

Flutter 3.19には、Google Mapsとテキスト入力拡大鏡がTLHCモードで動作するようにする作業が含まれており、これによりアプリのパフォーマンスが向上します。Google Mapsを使用している場合は、変更をテストしてフィードバックをお知らせください!

この作業には、FrameworkやEngineの下でのコミットは含まれていませんが、PR 5408およびTHLCのテスト手順を見ることができます。

カスタムシステム全体のテキスト選択ツールバーボタン

Androidアプリは、テキストを長押ししたときに表示されるテキスト選択メニュー(メニュー)に表示されるカスタムテキスト選択メニューアイテムを追加することができます。FlutterのTextField選択メニューには、これらのアイテムが現在組み込まれています。

iOS

Flutter iOSネイティブフォント

Flutterのテキストは、iOS上で少しコンパクトに、そしてよりネイティブに見えるようになりました。Appleのデザインガイドラインによると、iOS上の小さいフォントはモバイルで読みやすくするためにもっと広がっているべきであり、大きなフォントはあまりスペースを取らないようにもっとコンパクトであるべきです。以前は、すべてのケースでよりスペースを取る小さいフォントを誤って使用していました。現在、デフォルトではFlutterは大きなテキストに対してコンパクトなフォントを使用します。

DevTools

DevToolsのアップデート

このリリースでのDevToolsのハイライトは以下の通りです:

  • Androidでのディープリンク設定を検証するための新機能と画面がDevToolsに追加されました。
  • プラットフォームチャネルアクティビティを追跡するための「Enhance Tracing」メニューにオプションが追加されました。これは、プラグインを使用するアプリにとって有用です。
  • 接続されているアプリがない場合でも、パフォーマンスとCPUプロファイラの画面が利用可能になりました。DevToolsから以前に保存されたパフォーマンスデータやCPUプロファイルを再読み込みして表示できます。
  • VS CodeのFlutterサイドバーには、現在のプロジェクトで有効になっていない新しいプラットフォームを有効にする機能が追加され、サイドバーのDevToolsメニューにはDevToolsを外部ブラウザウィンドウで開くオプションが追加されました。

DevToolsのリリースノートを確認するには、2.29.02.30.0、および2.31.0のリリースノートをご覧ください。

デスクトップ

Windows Arm64サポート

Windows上のFlutterは、コミュニティメンバー@pbo-linaroの顕著な努力のおかげで、Arm64アーキテクチャの初期サポートを受け入れています。この初期サポートにより、Windows Arm64デバイス上でネイティブに実行されるより効率的でパフォーマンスの高いFlutterアプリケーションの道が開かれます。まだ開発中ですが、GitHubの問題#62597で進捗を追跡できます。これは、より広範なWindowsデバイスでアプリを最適化したいFlutter開発者にとって有望な改善です。

エコシステム

プライバシーマニフェストの要件

Flutterは、今後のAppleの要件を満たすためにiOSにプライバシーマニフェストを含めるようになりました。

FlutterとDartパッケージエコシステムの進捗

もし見逃していたら、FlutterとDartパッケージエコシステムの進捗に関する1月のブログ投稿をチェックしてください。

廃止予定および破壊的変更

Windows 7および8のサポート終了

Flutterは最新の技術に焦点を当てるため、Dart 3.3およびFlutter 3.19のリリースとともにWindows 7および8のサポートを終了します。この変更は、Microsoftの戦略に沿ったもので、私たちはこの移行を通じて開発者をサポートすることに尽力します。この動きは、サポートされるWindowsのバージョン上でより安全で、効率的で、機能豊富な開発環境を提供するためのものです。この変更への理解と適応に感謝します。

Impellerディザリングフラグ

3.16の安定版リリースのリリースノートで指摘されたように、グローバルフラグPaint.enableDitheringは削除されました。詳細については、ウェブサイトの破壊的変更のアナウンスを参照してください。

iOS 11の非推奨

特定のネットワーキングAPIが呼び出されたときにランタイムクラッシュが発生したため、FlutterはもはやiOS 11をサポートしません。これは、Flutter 3.16.6以降に対してビルドされたアプリはそれらのデバイス上で実行されないことを意味します。

自動レンダーモードの非推奨

このリリースには、v3.16のリリース後に期限切れになったAPIが非推奨とされる破壊的変更が含まれています。影響を受けるすべてのAPIと、追加のコンテキストおよび移行ガイドについては、このリリースの非推奨ガイドを参照してください。これらの非推奨は、IDEのクイック修正を含むFlutter fixによってサポートされています。一括修正は、dart fixコマンドラインツールを使用して評価および適用できます。

これらの破壊的変更を特定するために貢献されたテストにコミュニティに感謝します。Flutterの破壊的変更ポリシーについて詳しくは、公式ドキュメントをご覧ください。

このリリースでは、すでにサポートされているパッケージflutterflutter_testに加えて、flutter_driverパッケージも非推奨ポリシーに採用されました。

まとめ

この発表の冒頭で、貢献者の数を目立たせたのは意図的なものでした。Flutterが強力で効率的なツールキットに進化したのは、信じられないほどのコミュニティの献身と努力の直接的な証です。皆さん、心から感謝します。

このリリースで達成されたことの詳細については、リリースノートと 変更ログ をご覧ください。Flutter 3.19には、Dart 3.3とともに、安定チャネルで現在利用可能です。この最新のFlutterの旅に出ることは、flutter upgradeを実行することほど簡単なことはありません。