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

訳者 はじめに

Emma Twerskyさんによる「What’s new in Flutter 3.50」(原文)の日本語訳です。勝手に訳して、後から許可を取ります

はじめに

Flutter 3.50は完成し、Dart 3.14と併せてご利用いただけるようになりました。このリリースには、Flutterの今後の方向性を示す一連のアップデートが含まれています。ネイティブとの直接相互運用機能が安定版となり、DartとプラットフォームのネイティブAPI間の呼び出しが可能になりました。SafariおよびFirefoxにおけるWebAssemblyの高速化と、 ブラウザネイティブのテキストレイアウトと相まって、Flutter Webアプリの速度が大幅に向上しました。また、カスタムハードウェア向けのプラットフォーム埋め込みAPIを拡張し、新しいプロジェクトではスタンドアロンの material_ui および cupertino_ui パッケージがデフォルトで採用されるようになりました。

いつものように、Flutter コミュニティの皆様、そしてフレームワークやエコシステム全体への皆様の貢献がなければ、これらを実現することはできませんでした。今回のリリースサイクルだけでも、188 名のコントリビューター(うち 69 名が初めてのコントリビューター)が、1,200 件以上のコミットをマージしました。それでは、ターミナルで flutter upgrade を実行して最新リリースを取得するか、以下を読み進めて新機能を確認してください。

ネイティブとの直接相互運用性

昨年、私たちは、従来のプラットフォームチャネルに付き物のシリアライゼーションのオーバーヘッド、文字列ベースの煩雑な連携処理、および必須となっていた非同期処理による遅延を排除するための ネイティブとの直接相互運用性に関するビジョン を共有しました。Flutter 3.50では、この数年間にわたる取り組みが本番環境での利用に耐える段階に達しました。Objective-C向けのFFIgenおよびJava・Kotlin向けのJNIgenが、FFIgenの従来からのCサポートに加わり、安定版として提供されます。また、 Pigeonの新しいネイティブ相互運用モードをプレビューできます。このモードでは、内部で両方のジェネレータを使用して型安全なバインディングを作成します。

あらゆるネイティブ統合において、プラットフォームチャネルを介したメッセージのやり取りを省略し、Dartコードとプラットフォームコード間で直接呼び出しを行うことが可能になりました。これには、同期呼び出しやバックグラウンドアイソレートからの呼び出しも含まれます。FFIgenを使用してCおよびObjective-CのAPIをバインドするか、JNIgenを使用してFlutterおよびDartアプリ内のAndroidシステムAPIやカスタムJava/Kotlinライブラリをバインドしてください。マルチプラットフォームプラグインを構築する場合、Pigeonのネイティブ相互運用モードが、iOS、macOS、Android上でデータ変換とネイティブオブジェクトのライフサイクル管理を自動的に処理します。

従来のMethodChannelsによるシリアライズと、生成されたJNIおよびFFIによるホストAPIへの直接呼び出しを比較した図。

ダイレクトネイティブ相互運用では、プラットフォームチャネルによるシリアライゼーションを省略し、FFI および JNI を通じてネイティブ API を直接呼び出します。

すべてのパッケージ作成者、貢献者、およびアーリーアクセスプログラムの参加者の皆様、特に Jon Holtan 氏、Rody Davis 氏、Dominik Roszkowski 氏、Alexander Thiele 氏、Morgan McKenzie 氏に感謝申し上げます。これらのコミュニティメンバーは、開発初期段階のビルドのテストやドキュメントのレビューを行い、これらの API の形成に貢献してくれました。ダイレクトネイティブ相互運用に関する専用の記事にご期待ください。

詳細はこちら:ネイティブ相互運用性のドキュメント

Webプラットフォーム

Web上において、Flutter 3.50は、クロスブラウザでのWebAssembly実行の高速化に加え、組み込みのアセットキャッシュ更新機能、最新のJS相互運用性チェック、そしてより軽量なブラウザネイティブのテキストレンダリングを実現しています。

SafariおよびFirefoxでのWebAssembly

flutter build web --wasm を実行すると、アプリが WebAssembly と JavaScript の両方にコンパイルされ、古いブラウザでは自動的に JavaScript にフォールバックします。Chromium ベースのブラウザ(Chrome および Edge 137 以降)では、すでにデフォルトで WebAssembly が実行されています。Flutter 3.50 では、 Safari 26.2以降(macOSおよびiOS)とFirefox 147以降では、負荷の高いウィジェットベンチマークにおいて、JavaScriptの2倍以上のフレームレートを実現しています。将来の安定版リリースでデフォルトで有効になる前に、web/flutter_bootstrap.js を使用して今すぐ有効化することができます:

<div class="joplin-editable"><pre class="joplin-source" hidden="" data-joplin-language="" data-joplin-source-open="```
" data-joplin-source-close="
```">    {{flutter_js}}
    {{flutter_build_config}}
    _flutter.loader.load({
      config: {
        wasmAllowList: {
          blink: true,
          webkit: true,
          gecko: true,
        },
      },
    });

詳細はこちら:WebAssembly (Wasm) のサポート

組み込みの Web コンテンツハッシュ

更新された Flutter Web アプリをデプロイすると、リピーターユーザーのブラウザには古い JavaScript や不一致なアセットがキャッシュされたままになる可能性があります。flutter build web に --web-content-hash を指定することで、コンパイルされた JavaScript、WebAssembly、および build/web/assets/** のファイル名にコンテンツハッシュを埋め込み、flutter_bootstrap.js を自動的に更新することで、この問題を解決できます。これにより、ハッシュ化されたアプリバンドルやアセットを最大1年間(Cache-Control: public, max-age=31536000, immutable)、一方で index.html と flutter_bootstrap.js は no-cache のままに保つことで、デプロイのたびにクリーンな状態で読み込まれるようにします。また、このフラグはカスタムサービスワーカーや Workbox パイプライン用に build/web/precache_manifest.json を生成し、非推奨となった flutter_service_worker.js トークンに取って代わります。

詳細はこちら: Webコンテンツのハッシュ化とHTTPキャッシュ

Web上のレガシーなJS相互運用機能の監査

FlutterのWebアプリやプラグインは、ローカルストレージなどのブラウザ機能にアクセスしたり、サードパーティのJavaScript SDKをラップしたりするために、JS相互運用ライブラリを使用しています。Dartの古いJS専用ライブラリ(dart:html、dart:js、 dart:js_util、および package:js)は、dart:js_interop および package:web に置き換えられるため、現在非推奨となっています。これらの最新の代替ライブラリは、JavaScript ビルドと WebAssembly ビルドの両方で動作し、レガシーライブラリは将来の Dart リリースで削除される予定です。flutter build web、 flutter run、または flutter test --platform chrome に --no-deprecated-js-interop を渡すと、古い JS インポートを検出できます。アプリやそのパッケージのいずれかが依然としてレガシーなブラウザライブラリに依存している場合、ビルドが早期に失敗するため、WebAssembly への移行準備に役立ちます。

詳細はこちら:互換性のある JS 相互運用ライブラリの使用 および Dart 3.14 の発表

ネイティブブラウザテキストレイアウトのプレビュー

Chromeチームと共同で、Chromeの実験的な拡張 TextMetrics API に基づいて構築された WebParagraph により、ブラウザは C++ のフォントパーサーをバンドルすることなく、OS のフォントを使用してキャンバス上で直接テキストの字形を処理できるようになります。テキストレイアウトをブラウザに委ねることで、CanvasKitのダウンロードサイズが縮小され(5.46 MB から約 3.75 MB へ)、 フォールバックフォントのネットワークリクエストを排除し、多言語スクリプトにおける文字欠落による「豆腐ボックス」の発生を防ぎ、ネイティブカラーの絵文字をレンダリングします。

詳細はこちら: WebParagraph 実験的プレビュー (#172561)

プラグイン可能なプラットフォーム

Google I/O でのプラグイン可能なプラットフォームに関する発表に続き、Flutter を新しいオペレーティングシステムやハードウェアへより容易に移植できるよう、引き続き改善を進めています。Flutter 3.50では、基盤となるImpellerおよびVulkanエンベッダーAPIにおける2つの重要な課題を解決しました。コミュニティのコントリビューターであるxiaowei-guanがVulkanの外部テクスチャサポートを追加したことで、カスタムエンベッダーは[テクスチャをエンジンに直接渡す](https://github.com/flutter/flutter/pull/ 188855) により、ImpellerおよびSkiaバックエンド間でテクスチャをサンプリングできるようになりました。また、カスタムエンベッダーは、メモリの空き容量が少なくなった際に FlutterEngineNotifyLowMemoryWarning を呼び出して、Impellerのオフスクリーン・レンダリングターゲットキャッシュを 直ちにクリアできるようになりました。

分離されたデザインパッケージ


Flutter 3.47でのスタンドアロン版 material_ui および cupertino_ui の1.0リリースに続き、Flutter 3.50では、結合された package:flutter/material.dart および package:flutter/cupertino.dart ライブラリ、ならびに package:flutter_localizations 内のローカライズデリゲートが正式に非推奨となりました。flutter create で作成される新規プロジェクトでは、デフォルトで package:material_ui がインポートされるようになりました。

![dart fix –apply –code=migrate_design_widgets を使用して、pub.dev 上のバンドル済み SDK の material.dart および cupertino.dart ライブラリから、スタンドアロンの material_ui および cupertino_ui パッケージへの移行を示す図。] (https://flutter.dev/assets/decoupled_design_packages.422ea172d37807419128b85448d4ceae.webp)

dart fix を使用して、バンドルされた SDK のデザインライブラリから、スタンドアロンの material_ui および cupertino_ui パッケージへ移行します。

dart fix --apply --code=migrate_design_widgets を実行すると、既存のインポートおよびローカライズデリゲートが自動的に更新されます。

詳細:Material および Cupertino 移行ガイド および Material と Cupertino の分離

フレームワーク

コアフレームワーク全体において、コミュニティおよびチームからの貢献により、Sliver クリッピングウィジェット、より安定したテキスト選択、論理的な画像キャッシュ、アクセシビリティの改善、およびデスクトップ向けマルチウィンドウの更新が追加されました。

スクロールとスライバー

コミュニティの貢献者たちは、Flutter 3.50においてカスタムスクロールビューに際立った機能強化をもたらしました。Emmanuel Lefebvre Dibonは、clipOverlapオプションを備えたSliverClipRectおよびSliverClipRRectを追加し、固定されたヘッダーを切り取ることなく、スクロールセクションを丸めたり切り取ったりできるようにしました。Mairramerは、ListView.separatedにitemExtentBuilderを追加し、仕切り線のあるリストにおいて、画面外ウィジェットを生成することなく、高さの変動する行を必要に応じてサイズ調整できるようにしました。また、MairramerはScrollPhysics.shouldUpdateを導入し、設定が変更された際にアプリがスクロール動作を動的に更新できるようにしました。Soroush Yousefpour は RawScrollbar.mouseCursor を更新し、スクロールバーのサムおよびトラック上でのみマウスポインタを変更し、周辺のコンテンツ上では標準のカーソルを維持するようにしました。フレームワークの修正により、Scrollable.ensureVisible は、固定ヘッダーをスクロールして通り過ぎてしまうことなく、それを表示するために必要な正確なオフセット位置で停止するようになりました。SliverFillRemaining は、スクロールビューの末尾におけるオーバースクロールの伸縮オフセットを正確に計算するようになりました。最後に、TreeSliver は展開・折り畳みされるブランチをきれいにクリップするため、アニメーション中の子行が隣接するアイテムと重なることがなくなりました。

SliverClipRRect がスクロール中のスリバーコンテンツを角を丸くしてクリップするアニメーションデモ。

SliverClipRRectは、固定されたヘッダーを切り取ることなく、スクロールするセクションを角を丸くしてクリッピングします。

テキストの入力と選択

テキストの編集と選択が、モバイル、Web、デスクトップの各プラットフォームで著しく安定しました。Alex Li は、TextInputType.numberWithOptions に password オプションを追加し、Android アプリが PIN 入力用にセキュアな数字キーパッドを開けるようにしました。また、AndroidアプリではAutofillHints.emailOTPCodeを使用して、メールからワンタイム認証コードを自動入力できるようになりました。新しいHyphens列挙型により、単語が行をまたぐ際にソフトハイフンを表示するかどうかを制御できます。Nicodemus Linは、複数行のテキストでユーザーが上部の選択ハンドルをドラッグした際に画面が飛び跳ねる現象を修正しました。Nickolas de Luca Alberton は、中央揃えおよび右揃えの単一行テキストフィールドにおける上下矢印キーによるカーソル移動を修正しました。PageView 内のテキストをドラッグして選択しても、誤って隣接するページに切り替わることがなくなりました。また、左から右へのスクリプトと右から左へのスクリプトが混在する場合でも、選択ハンドルは選択されたテキストの方向を指し続けたままになります。

画像および描画 API

コミュニティの貢献者たちは、Flutter の画像読み込みおよびキャッシュ API も充実させました。Kishan Rathore は、DecorationImage に placeholder ImageProvider を追加し、読み込み中にコンテナの背景にフォールバック画像を表示できるようにしました。Anas Saifiは、不透明なプレースホルダーの上に画像を、空白がちらつくことなく滑らかにフェードインさせる FadeInImageTransition.fadeInOver を追加しました。[Koji Wakamiya] (https://github.com/koji-1009) は、ResizeImage に useLogicalSize を、Image に useLogicalCacheSize を追加し、BuildContext を必要とせずにキャッシュされた画像を画面密度に合わせてスケーリングできるようにしました。Ishaq Hassan は、RawImage に blendMode を公開し、カスタムウィジェットが画像を描画する際に直接色のブレンド効果を適用できるようにしました。カスタム BoxBorder の形状は、アニメーション中に状態間で滑らかに遷移するようになりました。HSVColor.lerp および HSLColor.lerp を使用した色のアニメーションは、カラーホイール上の最短経路をたどるようになり、予期せぬ色のずれが回避されるようになりました。

DecorationImage のアニメーションデモ。読み込み前はぼやけたプレースホルダーカードを表示し、読み込み完了後は鮮明なフル解像度の画像が表示されます。

DecorationImage.placeholder は、コンテナの背景画像が読み込まれる間、代替画像を表示します。

アクセシビリティとナビゲーション

Flutter 3.50 では、プラットフォームを問わず、キーボードナビゲーション、スクリーンリーダーのサポート、およびダイアログのカスタマイズが改善されました。カスタムスライダーウィジェットで SemanticsRole.slider を使用できるようになり、スクリーンリーダーが値やコントロールを正確に読み上げられるようになりました。アプリは MediaQueryData.reduceMotion を確認してユーザーの「モーションを軽減」設定を検出し、スライドアニメーションを穏やかなフェード効果に切り替えることができます。Escapeキーを押すと、キーボードフォーカスを移動させることなく、開いているTooltipおよびRawTooltipのオーバーレイが閉じられるようになり、Webアクセシビリティ基準に準拠しました。Web上では、VoiceOverおよびWidgetsApp.routerの修正により、オーバーレイ内でのスクリーンリーダーとキーボードフォーカスが安定し、予期せずリセットされることがなくなりました。Ishaq Hassan による FocusableActionDetector の新しい skipTraversal オプションにより、カスタムインタラクティブウィジェットで Tab キーによるナビゲーションを無効にできるようになりました。ダイアログについては、[Mairramer] (https://github.com/Mairramer) が提案した showDialog の新しい barrierBuilder コールバックにより、背景のぼかしを追加するなど、モーダルの背景をカスタマイズできるようになりました。最後に、Navigator.popUntilWithResult は、宛先のルートにローカル履歴エントリがある場合でも、最後にポップされたルートに結果を返すようになりました。

デスクトップのウィンドウ管理

Canonical との提携、およびメンテナーの Robert Ancell、Matthew Kosarek、Matej Knopp のおかげで、Flutter の実験的なマルチウィンドウデスクトップ API は、Linux、macOS、Windows において成熟し続けています。Linuxでは、アプリはカスタムタイトルバーや 透明なウィンドウ、および WindowControllerLinux を使用したネイティブなドラッグによる移動やサイズ変更の制御を作成できます。macOS では、ウィンドウやダイアログが表示される前にコンテンツに合わせてサイズを調整できるようになり、起動時のサイズ変更に伴う表示のちらつきを防ぐことができます。3つのデスクトッププラットフォームすべてにおいて、マルチウィンドウのコードを簡素化するため、RegularWindow は Window に名称変更されました。また、Flutterでおなじみのレイアウト命名規則に合わせるため、sizedToContent プロパティは shrinkWrap に置き換えられました。最後に、WindowManager が WidgetsApp の上位に配置されるようになったため、セカンダリウィンドウは独自の UI およびナビゲーション状態を管理できるようになりました。

macOS 上の Flutter マルチウィンドウリファレンスアプリケーションのスクリーンショット。メインウィンドウとセカンダリダイアログウィンドウが表示されています。

macOS 上で動作するマルチウィンドウデスクトップリファレンスアプリ。

エンジン

内部的には、Flutter 3.50 では Impeller のハードウェアアクセラレーションによるプリミティブレンダリングが拡張され、モバイル GPU の安定性が向上しWindowsおよびLinuxでのグラフィックスの描画品質が向上しています。

Impeller レンダリング

macOS、Linux、Windows向けのImpellerのSigned Distance Field(SDF)レンダラーは、CPU上で複雑なジオメトリを計算する代わりに、GPU上で直接シャープな境界線、形状、グラデーションを描画します。これにより、フレームのレンダリング時間が短縮され、カードや境界線、影が密集した画面でも、スクロールやアニメーションが滑らかに保たれます。Flutter 3.50では、この高速処理が線、細い境界線、角丸、グラデーションにも拡張されると同時に、macOSでのグラデーションや繰り返されるテキストの影の処理も高速化されています。カスタム3Dシーンや2Dゲーム向けに、Flutter GPUは2Dテクスチャ配列のサポートを追加しました。ゲームおよびグラフィックス開発者は、スプライトシート、タイルマップ、地形レイヤーをバッチ処理し、タイル間の目立つ継ぎ目なく、より少ない描画呼び出しでレンダリングできるようになりました。また、Flutter GPUは、シェーダーパイプラインの設定に誤りがある場合に、より明確なDartエラーメッセージを表示するため、グラフィックス関連のバグをより迅速に発見・修正できるようになります。

Impeller SDFでレンダリングされた滑らかなアンチエイリアス処理が施された対角線のエッジと、MSAAによる階段状のエッジを、拡大したピクセルを並べて比較した画像。

ImpellerのSigned Distance Field(SDF)レンダラーは、GPU上で直接、シャープでアンチエイリアス処理されたエッジを描画します。

コミュニティの貢献者たちは、OpenGLの起動やGPUの安定性に関する影響の大きい修正も実装しました。xiaowei-guanは、OpenGLシェーダーの設定をバックグラウンドスレッドに移行し、アプリが最初のフレームをより高速に表示できるようにしました。seunggiは、テクスチャの読み込み時にMali GPUで発生するクラッシュを修正し、影響を受けるAndroidデバイスでの予期せぬアプリ終了を防ぎました。krll-kovは、旧型デバイスにおけるOpenGL ES 2のテクスチャレンダリングを修正し、アニメーション画像においてフレーム間の透明度を維持できるようにしました。また、FlutterはBシリーズのPowerVR GPUにおいて、レンダリングの不具合を防ぐため、VulkanからOpenGLへ自動的にフォールバックするようになりました。

デスクトップグラフィックス

Windows および Linux において、デスクトップレンダリングの忠実度とパフォーマンスが大幅に向上しました。Windows エンジンは、デフォルトで OpenGL ES 3 を要求するようになりましたが、OpenGL ES 2 への自動フォールバック機能も維持されており、古い PC でも最新のグラフィックス機能を利用できるようになりました。Windowsアプリでは、国際的なユーザー名やフォルダ名など、非ASCII文字を含むパスからアセットやファイルをロードできるようになりました。また、Windowsではコントラストが向上し、テキストの表示がより鮮明になったほか、フレームごとの余分なフルスクリーンコピーを省略することで、GPUのオーバーヘッドを軽減しています。WindowsとLinuxの両方で、アンチエイリアシングが改善され、重ねられたUI要素やカスタムシェイプのギザギザしたエッジが滑らかになりました。

iOSおよびmacOS

Xcode 27およびiOS 27のリリース以来初の安定版となるFlutter 3.50では、iOSのタッチ遅延が短縮され、実機でのデバッグがスムーズになり、CocoaPodsおよびIntel Macからの移行がさらに進められています。

iOSのタッチ応答速度の向上

コミュニティメンバーのMatej Knopp氏による、iOSのタッチイベント後のフレーム生成のスケジューリング方法に関する大幅な見直しにより、タッチイベントがフレームワークに即座に伝達されるようになりました。これにより、次のvsyncを待つことなく、同じディスプレイのリフレッシュサイクル内でフレームが構築されるようになりました。その結果、入力レイテンシが1フレーム分短縮されました(60 HzのiOSデバイスでは16 ms高速化、120 HzのProMotionディスプレイでは8 ms高速化)。これは、2015年発売のiPhone 6sにまで遡るハードウェアを用いた広範なベンチマークテストによって検証されています。今後のリリースでは、iOSの入力レイテンシをさらに低減するための取り組みを進めています。ご期待ください。

Flutter 3.50 における iOS タッチ応答の高速化を示す並列比較画像。

Flutter 3.50では、iOSのタッチ処理の高速化により、入力レイテンシが1フレーム分短縮されました。

詳細はこちら:iOSタッチ入力レイテンシのベンチマーク (#191199)

iOS 27 でのデバッグ

新しくペアリングした、またはアップグレードしたばかりの iPhone でアプリを実行する際、Xcode を一度開くまで白い画面で停止してしまうことがなくなりました。Flutter CLI はデバイスを自動的に準備するようになり、準備に失敗した場合は対処方法を表示します。また、Flutter 3.50 では、iOS 27 搭載デバイスで flutter run を実行した際に発生していた、時折起こる起動時のクラッシュも修正されました。Xcode 27 でのビルドにより、iOS 17 以来初めて、実機の iPhone および iPad での flutter screenshot 機能が復元されました。デバッグ中に、ターミナルから直接実行中のアプリのスクリーンショットを撮影できるようになりました。

Swift Package Manager への移行

2026年12月に CocoaPods のトランクが読み取り専用となることに伴い、Flutter の一時的な CocoaPods フォールバック機能は段階的に廃止されます。Flutter 3.50 以降、Swift Package Manager を無効にすると、Flutter CLI コマンドを実行するたびに警告が表示されます。今後のリリースでは、オプトアウトフラグを削除し、最終的には CocoaPods によるフォールバック自体も廃止する予定です。ビルドの問題を回避するために以前に Swift Package Manager を無効にしていた場合は、今すぐ再有効化して設定を確認してください。

詳細はこちら:プラグイン作成者向けのSwift Package Manager

Apple Silicon搭載macOSでのビルド

FlutterはIntel Macハードウェアでのテストを終了しており、Intel Macでビルドを行うとCLIから1回警告が表示されるようになりました。今後のリリースで Intel Mac ホストのサポートが廃止されると、iOS、macOS、または Android 向けのビルドには Apple Silicon Mac が必要になります。Xcode 27 では、macOS アプリに Intel スライスをバンドルする必要がなくなったため、今後のリリースでこれがデフォルトになる前に、flutter config --enable-macos-arm64-only を実行することで、今すぐ Apple Silicon 専用の macOS アプリをビルドできます。

詳細:macOS Intelの非推奨化戦略

Android

Androidでは、Flutter 3.50により、リリースモードの Intent のセキュリティが強化され、プラットフォームビュー向けのHybrid Composition++が拡張され、Android Gradle Plugin 9の新しいDSLに対するオプトインサポートが利用可能になりました。

Intentのセキュリティ強化

従来、FlutterでビルドされたAndroidアプリは、ユーザーのデバイスにインストールされている任意のアプリからのランタイムIntent設定エクストラを受け入れていました。Flutter 3.50では、標準的なディープリンク機能を維持しつつ、リリースビルドにおけるこの脆弱性を解消しています。具体的には、リリースビルドでは、外部のIntentエクストラからのroute、 dart_entrypoint、および cached_engine_id の値を無視し、また、Intent エクストラを通じて渡されたランタイムエンジンフラグや、ビルド済みのリリース APK と --use-application-binary を組み合わせて指定された –dart-flags などのランタイムエンジンフラグを拒否します。デバッグビルドでは、無視されたエクストラについて警告がログに記録されますが、事前ビルドされたバイナリに対してカスタムエンジンフラグをテストするには、プロファイルモードまたは新規ビルドが必要になりました。

詳細:アプリのエントリポイントに対する Android Intent の検証強化 および リリースモードにおける Android エンジンフラグの制限

Hybrid Composition++

Hybrid Composition++ (HCPP) は、Flutter の最新のプラットフォームビューアーキテクチャであり、従来のコンポジティングモードで見られたスクロールのティアリングやテキスト入力の不具合を解消しつつ、マップや Web ビューなどのネイティブ Android ビューを埋め込むことができます。コンポジティング処理をAndroid OSに直接委ねることで、HCPPはよりスムーズなスクロールを実現します。Flutter 3.50では、AndroidViewSurfaceでのバッファなしモーションイベントのディスパッチや、RenderAndroidViewにおけるレイアウト順序の修正により、さらに改善が図られています。コミュニティのコントリビューターである Amaan Ansari は、FlutterEngine が Activity よりも長く存続した場合に発生するクラッシュも修正しました。

HCPP は Flutter 3.44 安定版から利用可能となっており、3.49.0-0.1.pre 時点のベータチャネルではデフォルトで有効になっています。今後のリリースでは、安定版のデフォルト設定となる予定です。HCPP を利用するには、Android 14(API 34)以降および Vulkan 上で動作する Impeller が必要である点に留意してください。両方の要件を満たさないデバイスでは、Flutterは自動的に既存のプラットフォームビューモードにフォールバックします。API 34以上のVulkan対応デバイスでは、flutter config --enable-hcpp を実行し、デバッグモードでlogcatを確認して、プラットフォームビューがマウントされた際に Using HCPP platform view rendering strategy と表示されることを確認してください。

詳細:Platform Views によるネイティブ Android ビューのホスティング

プラグイン向けの組み込み Kotlin

Flutter 3.44 の新機能 で紹介されたように、 Android コードを含む Flutter プラグインは、Android Gradle Plugin(AGP)の組み込み Kotlin へ直接移行する必要があります。AGP のバージョンガードを適用している場合でも、依然として Kotlin Gradle Plugin(KGP)を手動で適用しているプラグインは、将来的に pub.dev のスコアが低下し、AGP 10 ではビルドに失敗するようになります。プラグインの Gradle 設定を更新し、pubspec.yaml 内のFlutter SDKの最小バージョン制約を flutter: 「>=3.44.0」 に設定し、CHANGELOG.md にこの変更を記載してください。

詳細:プラグイン作成者向け組み込みKotlin移行ガイド

AGP 9 の新しい DSL サポート

Flutter 3.47 から Flutter 3.50 にかけて、Flutter Gradle プラグインを、レガシーな BaseExtension の内部実装ではなく、最新の公開 Android Gradle プラグイン 9 API に基づいて書き直しました。また、flutter/packages 内のすべてのファーストパーティ製プラグインを移行し、サポート対象の AGP バージョン全体で組み込み Kotlin をサポートするようにしました。Flutter 3.50 安定版では、プロジェクト内のすべてのプラグインが Built-in Kotlin をサポートするようになれば、アプリを AGP 9 の新しい DSL に切り替えることができます。

詳細はこちら: アプリ開発者向け Built-in Kotlin 移行ガイド

Android ツールチェーンのデフォルト設定の更新

Flutter 3.50 で生成される新しい Android プロジェクトでは、Android Gradle Plugin (AGP) 9.3.1 および Gradle 9.5.0 が使用され、Kotlin Gradle Plugin 2.4.20 および Java 17 以上との互換性が確認されています。プロジェクトで AGP の組み込み Kotlin を使用する場合、AGP が Kotlin の互換性を直接管理するため、Flutter は Kotlin バージョンの警告を表示しなくなりました。このリリースで Gradle ビルドファイルに公開されるデフォルトの SDK 変数は、flutter.compileSdkVersion API 36、flutter.targetSdkVersion API 36、および flutter.minSdkVersion API 24 です。

開発者体験

Flutter 3.50 における日常的なワークフローの更新点として、公式の AI エージェントプラグイン、再利用可能なパッケージスキル、および Dart Analysis Server における初回の名前変更リファクタリングの高速化が導入されました。

AIコーディングプラグインとパッケージスキル

Flutter 3.50では、AIコーディングアシスタントを使用して開発を行うチーム向けのファーストパーティツールが拡充されました。公式のFlutterエージェントプラグインには、タスク指向のエージェントスキル、DartおよびFlutter MCPサーバーの設定、専用エージェント、そしてプロアクティブなホットリロードルール(flutter-hot-reload)が含まれています。これは、lib/ ディレクトリ内の編集後に、MCP サーバーを介して hot_reload または hot_restart をトリガーするものです。

パッケージ作成者は、pub.dev パッケージ内の最上位ディレクトリ skills/ にエージェントスキルを直接同梱することも可能です。これにより、アプリ開発者は dart run skills@get コマンドを使用して、パッケージの依存関係からスキルを発見・インストールできるようになります。公開前に、 作成者はCI環境でpackage:skills_lintを実行し、SKILL.mdのフロントマター、ディレクトリ構造、命名規則がエージェントスキル仕様に準拠しているかを確認できます。

詳細はこちら:AIを使った開発を始める および スキルのパッケージ化

分析サーバーと DevTools

日常的なエディターのワークフローにおいて、Dart 分析サーバーは、検索インデックスを構築する際に、分析ドライバー間で共有パッケージディレクトリの検出を重複排除します。これにより、マルチパッケージワークスペースでの初回リネームリクエストが高速化されます(16 コンテキストの DevTools ワークスペースでは 57% 高速化され、2.0 秒から 0.9 秒に短縮)。さらに、Flutter DevTools では、スタンドアロンの material_ui および cupertino_ui パッケージが使用されるようになりました。

AI とエコシステム

より広範なエコシステム全体では、本番環境向けの AI パッケージが重要なマイルストーンを達成したほか、Google Play アプリの数が 100 万件に達し、Flutter の RFC プロセスが公開されました。

Genkit Dart 1.0

Genkit Dart が安定版 1.0 をリリースしました。これにより、Dart および Flutter を使用して、エンドツーエンドの型安全性、ストリーミングフロー、ツール呼び出し、OpenTelemetry トレースを備えたフルスタックかつマルチモデルのエージェント型アプリケーションを構築できるようになりました。

Genkit Dart と A2UI を使用して、インタラクティブなレストラン予約カードをストリーミングし、予約ツールを呼び出す Cymbal Bistro Flutter アプリのアニメーションデモ。

Genkit Dart 1.0 による Flutter アプリでの、インタラクティブな A2UI 予約フローとツール呼び出しのストリーミング。

詳細はこちら:Genkit Dart ドキュメント

MediaPipe によるデバイス内 AI

pub.dev に公開された Google AI Edge の新しい MediaPipe パッケージにより、LiteRT および LiteRT-LM を基盤とする デバイス上で実行できる、画像・音声・テキスト処理に関する20種類のタスクを Flutter アプリに直接組み込むことが可能になりました。これらのモデルをデバイス上で直接実行することで、ネットワークの遅延やクラウド推論のコストを回避できます。

詳細はこちら:Flutter向けMediaPipeタスクのギャラリー

Playストアのアプリが100万本突破

Flutterコミュニティは最近、Google Playに公開されたFlutterアプリが100万本を超えたという画期的なマイルストーンを達成しました。Flutterを活用してアプリを開発・リリースし、成長させてくれているすべての開発者およびチームの皆様に感謝申し上げます。

パッケージエコシステムのハイライト

パッケージエコシステム全体において、スクロール可能なリスト内のインライン AdMob バナーを再利用することで、当社のベンチマークにおいて iOS でのパフォーマンスが 23% 向上 することが確認されました。また、今回のリリースサイクルで提供された、特に注目すべき 2 つのコミュニティパッケージも紹介したいと思います: 純粋なDartでクラウドインフラストラクチャを定義するための Terradart と、Flutterでインタラクティブなノード図をプログラムから構築するための vyuh_diagram_flutter です。

詳細はこちら:AdMob バナー再利用ガイド

顧客事例

世界中のチームが、Flutter を使用して野心的な本番アプリをリリースし続けています。Holafly は、3か月でモバイルアプリを単一のFlutterモノレポに統合し、月間200万人以上のユーザーと2,500万枚のeSIMに対応しています。Knowunityは、FlutterとGo、Geminiを組み合わせて、月間800万~1,000万人のアクティブ学生をサポートしています。Buzzは、iOSとAndroidでFlutterを活用し、人とAIエージェントが肩を並べて協業するオープンソースのワークスペースを実現しています。Google AI Edgeチームは、モバイルおよびデスクトップのユーザーにデバイス上のAI推論を提供するため、Flutterを用いて「Eloquent」および「Foresight」アプリを構築しました。

Flutterのビジネス価値

エンジニアリングリーダーが今後のロードマップ策定においてFlutterを評価できるよう、当社の新しい2026年版ホワイトペーパーでは、エンジニアリングの生産性、開発速度、およびビジネスにおける投資対効果(ROI)に関するデータに基づいた洞察を共有しています。

詳細はこちら:Flutterのビジネス価値

Flutter RFCの発表

Flutterでは、技術設計や意思決定において、公開型の「Request for Comments(RFC)」プロセスを採用しています。RFCは、本番コードを記述する前に、早期にアイデアを共有し、トレードオフを検討し、サブシステムのメンテナーと足並みを揃え、アーキテクチャに関する合意を形成するための、協力的かつ透明性の高い場を提供します。

詳細はこちら:Flutter 設計文書 および flutter/rfc

非推奨事項と破壊的変更

Flutter 3.50 では、相互に密接に関連する package:flutter/material.dart および package:flutter/cupertino.dart ライブラリ、ならびにそれらの flutter_localizations デリゲートが正式に非推奨となりました。また、Androidのリリースビルドでは、より厳格な Intent の検証が実施され、デバッグ用エンジンフラグがブロックされるようになりました。これに加えて、4つのウィジェットの動作も変更されています。package:material_ui では、 DropdownButtonFormField に明示的な enabled プロパティが追加され、onChanged コールバックに null を渡す代わりに、ドロップダウンを直接無効化できるようになりました。ソフトハイフンを含むテキストは、単語が改行されるたびに、目に見えるハイフンが自動的に表示されるようになりました。右から左へのテキスト内のインライン WidgetSpan 要素は、予期せず順序が逆転することなく、自然な読み順で表示されるようになりました。モバイルブラウザでは、viewport-fit=cover が設定されている場合、SafeArea がデバイスのノッチやホームインジケーターを考慮するようになり、UI が画面の切り欠き部分に重ならないようにします。

また、このリリースでは 2 つのフレームワークのクリーンアップも実施されています:

  • 以前非推奨となっていた ignoringSemantics プロパティが、IgnorePointer、AbsorbPointer、SliverIgnorePointer、およびそれらのレンダリングオブジェクトから削除されました。
  • RenderProxyBox および RenderProxyBoxMixin を使用するその他のレンダリングオブジェクトの computeDryBaseline は、子要素にベースラインがない場合、アサーションエラーを発生させる代わりに null を返すようになりました。

詳細はこちら: Flutter の互換性破りの変更点

出来立てほやほや、アップグレードの準備は万端


Flutterの次の10年を形作るために、イシューを報告し、設計をレビューし、プルリクエストをマージしてくださったコミュニティのすべての貢献者の皆様に感謝いたします。Flutter 3.50が、Dart 3.14と共に、まさに「焼きたて」の状態で登場しました。今すぐSDKをアップグレードして、このリリースのすべての機能をお試しください:
flutter upgrade

このリリースに含まれるすべてのプルリクエストを確認するには、Flutter 3.50 リリースノート および 互換性破りの変更点 をご覧ください。