訳者 はじめに
Kevin Chisholmさんによる「What’s new in Flutter 3.38」(原文)の日本語訳です。勝手に訳して、後から許可を取ります(笑)
FlutterKaigi2025の当日朝に新バージョンがリリースされて、発表者様はプレゼン資料を更新していた
はじめに
四半期ごとの定期リリース、Flutter 3.38 へようこそ。今回のアップデートでは、ドット省略記法とウィジェットプレビューの更新により、生産性の向上と開発者体験の洗練に焦点を当てています。コミュニティの皆様のおかげで、このリリースには145名のユニークな貢献者による合計825件のコミットが含まれており、そのうち37名が初めての貢献者です。さっそく、今回のリリースの内容を見ていきましょう。
ドット省略記法
より簡潔なDartコードを記述しましょう!新たなDart機能であるドット省略記法の導入を発表できることを嬉しく思います。この省略記法により、Dartが推論可能な型を省略でき、冗長な記述を削減できます。
例えば、MainAxisAlignment.start の代わりに、.start と記述できます。
// 省略記法使用時
Column(
mainAxisAlignment: .start,
crossAxisAlignment: .center,
children: \[ /* ... */ \],
),
// 省略記法未使用時
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: \[ /* … */ \],
),
名前付きコンストラクタでも同様です!EdgeInsets.all の代わりに .all と記述できます:
Padding(
padding: .all(8.0),
child: Text(『Hello world』),
),
この機能はDart 3.10およびFlutter 3.38でデフォルト有効です。詳細はdart.devのドット省略記法ページを参照してください。Dart 3.10リリースブログ記事ではこれに加え(Dartフックなど)も解説しています。
Web
Web開発設定ファイル
flutter runコマンドがWeb設定用の設定ファイルをサポートするようになりました。これにより、プロジェクトルートにあるweb_dev_config.yamlファイルでホスト、ポート、証明書、ヘッダー情報を指定できます。チーム全員が同じ設定でデバッグできるよう、このファイルをコミットしてください。詳細はWeb開発設定ファイルの設定を参照してください。
Web開発プロキシ設定
既存のコマンドラインフラグに加え、Web開発設定ファイルで新たなプロキシ設定をサポートします。プロキシ設定により、設定されたパスへのリクエストを別のサーバーに転送可能になります。これにより、同一ホスト上の動的エンドポイントに接続するWebクライアントの開発が容易になります。
プロキシ設定の詳細はWeb開発設定ファイルの設定も参照してください。
Web でのホットリロードのサポート拡大
-d web-server で実行し、ブラウザで Flutter アプリケーションのリンクを開くと、ステートフルなホットリロードがデフォルトで有効になります。これは複数のブラウザが同時に接続している場合でも機能します。
-d chrome と同様に、この機能は --no-web-experimental-hot-reload フラグを使用して一時的に無効にできます。この機能の無効化オプションは将来のリリースで削除される予定です。開発ワークフローで問題が発生した場合は、DartのWebホットリロード問題報告テンプレートを使用してバグを報告してください。詳細はWebホットリロードのドキュメントを参照してください。
フレームワーク
本リリースでは、フレームワーク全体にわたり強力な新機能と改良が多数追加され、高度なUI、ナビゲーション、プラットフォーム連携に対する開発者の制御精度が向上しました。
OverlayPortal を使用してポップアップ、ダイアログ、その他のフローティング UI 要素を作成する際、開発者はより強力な制御が可能になりました。OverlayPortal.overlayChildLayoutBuilder
を使用することで、ウィジェットツリーの任意の親 Overlay 内に子要素をレンダリングできるようになりました(#174239)。これにより、アプリ全体の通知や、親ウィジェットのレイアウト制約を回避する必要があるその他の UI を表示することが容易になりました。基盤となるOverlay.ofメソッドも堅牢性と効率性が向上しました(#174315)。
よりモダンなAndroidナビゲーション体験のため、MaterialAppでは予測的なバックルート遷移がデフォルトで有効化されました(#173860)。ユーザーがバックジェスチャーを実行すると、現在のルートがアニメーションで消える際にホーム画面のプレビューが表示されます。さらに、ネイティブ動作を反映するため、デフォルトのページ遷移がZoomPageTransitionsBuilderからFadeForwardsPageTransitionsBuilderに変更されました。
本リリースではデスクトップ統合も強化されました。Windowsでは、接続されたディスプレイの一覧にアクセスし、解像度、リフレッシュレート、物理サイズなどの詳細プロパティを各ディスプレイごとに照会できるようになりました(#164460)。これにより、高度なウィンドウ管理機能を備えたアプリケーションの開発が可能になります。
最後に、フレームワーク自体の耐障害性が向上しました。ウィジェットライフサイクルコールバック(didUpdateWidgetなど)で発生するエラーは、より適切に処理されるようになり、要素ツリーでの連鎖的な障害を引き起こすのを防ぎます(#173148)。ResizeImageは等価性を正しく実装するようになり、同一のResizeImageプロバイダーが同じように扱われることを保証することで、画像のキャッシュと比較がより予測可能になりました(#172643)。
ウェブ上では、RSuperellipseの修正によりUIの洗練が継続されています。これにより、コーナー半径がウィジェット自体よりも大きい場合のレンダリングエラーが防止され(#172254)、代わりに、そのようなケースは期待どおりに丸みを帯びた形状を生成するように処理されます。
国際的なユーザーにとって、ブラウザの優先ロケールの検出がより堅牢になりました。エンジンは標準のIntl.Locale Web APIを使用してブラウザ言語を解析するようになり、以前の手動で脆弱な実装(#172964)に取って代わりました。この変更により、より信頼性の高いロケール検出と、グローバルなユーザー体験の向上が実現されます。
Android固有のバグ(#171973)が修正されました。これは主にハードウェアキーボードを搭載したSamsungデバイスに影響していました。以前は、ユーザーがTextFieldを操作した後、Android入力メソッドエディタ (IME)が古い状態に固着する可能性がありました。これによりIMEが誤って「Enter」や「Space」キー入力を捕捉し、CheckboxやRadioボタンなどの非テキストウィジェットがイベントを受信できなくなる問題が発生していました。修正により、テキスト接続が閉じられた際にInputMethodManagerが正しくリセットされ、IMEの古い状態がクリアされるため、ユーザーは予測可能なハードウェアキーボード操作を回復できます。
マテリアルおよびクパチーノの更新
マテリアルおよびクパチーノライブラリは、APIの一貫性と洗練されたユーザー体験に焦点を当てて進化を続けています。今回のリリースでは、主要なAPI移行、新しいウィジェット機能、そして美しく機能的なUI構築をより容易にする数多くの改良がもたらされます。
MaterialStateの非推奨化を基盤として、本リリースではより統一されたWidgetStateへの内部移行を継続します。これにより、押下時、ホバー時、無効時など異なるインタラクション状態におけるウィジェットの外観を一貫した表現方法で定義可能となり、既存アプリの変更は不要です。この移行は、IconButton、ElevatedButton、Checkbox、Switch(#173893)を含む幅広いウィジェットとそのテーマに適用されました。新APIはさらに強力さと柔軟性を追加します。例えば、IconButtonにはstatesControllerプロパティ(#169821)が追加され、視覚状態をプログラムで制御できるようになり、よりカスタマイズされたインタラクティブなデザインの可能性が広がりました。
このリリースでは、いくつかの新機能と便利なAPIも導入されています。Badge.countコンストラクタには、表示されるカウントを簡単に制限するためのmaxCountパラメータが追加されました(#171054)。これにより、例えば「100」ではなく「99+」と表示することが可能になります。
より細かいジェスチャー制御のために、InkWell ウィジェットにonLongPressUp コールバックが追加されました(#173221)。これは、ユーザーが指を離したときにのみアクションを完了させる場合に便利です。
CupertinoライブラリはiOSの忠実度向上を継続。CupertinoSlidingSegmentedControlにisMomentaryプロパティを追加(#164262)。これにより選択状態を保持せずにアクションをトリガー可能に。ネイティブiOS動作に近づけるため、CupertinoSheetは完全に展開された状態で上方向にドラッグした際に微妙な「伸び」効果を実装(#168547)。
最後に、本リリースではコアコンポーネントの動作を洗練させる改良が多数盛り込まれています。主な改善点として、フォームリセット時にDropdownMenuFormFieldのテキストフィールドを正しくクリアする修正(#174937)、SegmentedButtonのフォーカス処理改善(#173953)、およびウィジェットの状態を境界線で正確に反映させる修正(#172754)が挙げられます。
MaterialとCupertinoの分離
フレームワークからMaterialおよびCupertinoライブラリを分離するための計画を進めています。以下は最近公開された設計文書に関する議論のリストです。
分離後のMaterialおよびCupertinoを含むflutter/packagesのリリースの改善。
- ステータス: 決定済み
- アイデア: ファーストパーティパッケージリリース戦略
- 決定内容: バッチリリース概要 (公開済み)
カラーとドットの省略形
- ステータス: 決定済み
- Flutter用基本カラーセット (公開済み)
テストの分離
テキスト
- ステータス: 検討中
- Flutter テキストからの分離設計 (公開済み)
スクロール: より堅牢で予測可能なスライバー
今回のリリースでは、複雑なスクロールレイアウト、特に SliverMainAxisGroup および SliverCrossAxisGroup を使用したレイアウトの構築をより堅牢かつ予測可能にする多数の修正が行われました。
これらのウィジェットを使用して複数のスライバーをグループ化している開発者は、ジェスチャー処理の信頼性が向上したことを実感できるでしょう。グループ内のスライバーに対するタップやその他のポインタイベントのヒットテストが正しく計算されるようになり、ユーザー操作が期待通りに動作するよう保証されます(#174265)。
その他、SliverMainAxisGroup
内でのスクロール動作精度向上のための修正が複数実施されました。固定ヘッダー使用時のオーバースクロール問題が解決され(#173349)、スライバー表示のための
showOnScreen
呼び出しが正常に動作するようになり(#171339)、内部スクロールオフセット計算がより精密になりました(#174369)。
カスタムスクロールビューを構築する開発者向けに、新しいSliverGrid.listコンストラクタ(#173925)により、単純な子要素リストからグリッドを作成するよりクリーンな方法が提供されます。
また、複雑なレイアウトにおけるキーボードおよびDパッドユーザー向けのフォーカスナビゲーションも改善されました。異なるスクロール軸を持つネストされたスクロールビュー(水平カルーセルの垂直リストなど)において、方向フォーカスナビゲーションがより予測可能になり、セクション間でフォーカスが予期せず移動するのを防止します (#172875)。
アクセシビリティ:すべてのユーザーに向けた包括的な体験
すべてのユーザーがアプリケーションを利用できるようにすることは、Flutterフレームワークの基盤です。本リリースでは、開発者向けのプログラム制御の強化、国際的なユーザー体験の改善、コアウィジェットのアクセシビリティ向上を通じて、この取り組みを継続しています。
複雑なアプリケーションを構築する開発者向けに、iOSで WidgetsFlutterBinding.instance.ensureSemantics を使用することでアクセシビリティをデフォルトで有効化する機能が導入されました (#174163)。 debugDumpSemanticsTree には追加のテキスト入力検証結果情報が含まれるようになり、問題の迅速な診断が可能となり、アクセシビリティ問題のデバッグが容易になりました (#174677)。
スライバーベースのスクロールビューにおける高度なアクセシビリティのため、新しい SliverSemantics ウィジェット(#167300)が利用可能になりました。既存の Semanticsウィジェットと同様に、開発者は CustomScrollView内で SliverSemanticsを使用し、スライバツリーの一部を特定の意味情報で注釈付けできます。これは特に、ヘッダーの注釈付け、セマンティクスロールの割り当て、スクリーンリーダー向けのスライバへの説明ラベル追加に有用で、ユーザーにとってより理解しやすくアクセシブルな体験を提供します。
最後に、コアウィジェットのアクセシビリティも継続的に改善されています。CupertinoExpansionTile はデフォルトでアクセシブルになりました(#174480)。また、AutoComplete ウィジェットは検索結果の状態をユーザーに音声で通知するようになりました(#173480)。TimePicker のタッチターゲット拡大(#170060)など、その他の改善も相まって、よりアクセシブルな初期状態での体験が実現されています。
iOS
Flutterが最新のプラットフォームリリース(9月に公開されたiOS 26、Xcode 26、macOS 26)を完全にサポートしていることを確認しました。これにより、Appleの最新OSとツール環境で即座にアプリ開発とテストを開始できます。
前回のFlutterリリースでは、iOS開発者向けの重要なQoL改善が実装され、長年の課題であった「flutter run」による実機実行時にXcodeが自動起動する仕様が解消されました。アプリインストール・起動・デバッグ用に、Xcode 26のコマンドラインツールdevicectlを利用した新たなデプロイ手法を導入しました。
この移行により、デプロイ時にXcodeアプリケーションを起動する必要がなくなり、ほとんどの場合コマンドラインのXcodeビルドツールのみに依存します。問題が発生した場合は、flutter config --no-enable-lldb-debuggingでこのデプロイ方法を無効化できます。また、問題報告をお願いします!
従来この機能はXcodeの自動化に依存していましたが、Xcode 26では特に連続コマンド実行時に不安定かつ動作が不安定になりました。最新のAppleリリース向けに開発されている場合は、Flutterを3.38以降に更新することを強く推奨します。
UISceneライフサイクル移行
Flutter 3.38では、Appleが義務付けるUISceneライフサイクルへの必須対応が含まれています。これはWWDC25におけるAppleの発表「iOS 26以降のリリースでは、最新SDKで構築されたUIKitアプリはUISceneライフサイクルの使用が必須となり、未対応の場合は起動できなくなる」を受けて実施する重要な事前対応です。
iOS Flutterアプリケーションが将来のiOSリリースでも互換性を保ち正常に起動するよう、移行が必要です。
Flutterアプリケーションの移行
既存のiOS Flutterアプリケーションは全て新しいライフサイクルへ移行する必要があります。移行には以下の2つの方法があります:
- 手動移行:Flutterの公式サイトに記載の手動移行手順に従ってください。
- 自動移行(実験的機能):移行を自動処理する実験的機能を有効化します。これは将来のリリースでデフォルトで有効になります。以下のコマンドを実行してください:
flutter config --enable-uiscene-migration
Flutterプラグインの移行
アプリケーションライフサイクルイベントに依存するFlutterプラグインは、UISceneライフサイクルイベントを使用するように更新する必要があります。プラグイン開発者は移行ガイドを参照してください。移行されていないプラグインは、将来のリリースで警告が表示されます。
組み込みFlutterの移行 (任意)
ネイティブホストアプリケーション内にFlutterを埋め込むプロジェクトでは、移行は任意ですが強く推奨されます。アプリへの追加移行ガイドを使用してFlutterの新しいUIScene APIを採用すると、プラグインのシーンライフサイクルイベントが有効になり、Flutterエコシステムとの互換性が確保されます。
Android
16KBページサイズ互換性
Flutter 3.38へのアップグレードは、Google Playの16KBページサイズ互換性要件に対する必須の準備です。2025年11月1日以降、Android 15以降を対象とするアプリは16KBページをサポートする必要があります。この変更により、高RAMデバイスでのアプリの正常な動作が保証され、起動速度が最大30%向上するなどのパフォーマンス上の利点があります。Flutter 3.38では、デフォルトのAndroid ndkVersionがNDK r28に更新され、ネイティブコードが16KBサポートに適切に対応するために必要な最低限の要件を満たします。
メモリ修正
Flutter 3.38 は、Android上のすべてのFlutterアプリに影響する重大なメモリリークを修正します。この問題(3.29.0で導入)は、開発者設定で構成された退出時のアクティビティ破棄時、またはメモリ不足によるシステムによるアクティビティ強制終了時に発生していました。
Android 依存関係の更新
Gradle、Android Gradle プラグイン (AGP)、Kotlin Gradle プラグイン (KGP)、Java など、アプリで動作する Android 依存関係の適切なバージョン組み合わせを把握することは、しばしば困難です。Flutter 3.38 リリースでは、継続的インテグレーション(CI)環境において以下の Android 依存関係バージョンセットとの互換性をテストし確認しました:
- Java 17: Flutter 3.38 での Android 開発に必要な最低バージョン。
- KGP 2.2.20: ツールチェーン向けに確認済みかつサポートされる Kotlin Gradle Plugin の最大バージョン。
- AGP 8.11.1: KGP 2.2.20 と互換性のある最新の Android Gradle Plugin バージョン。
- Gradle 8.14: 選択した Java、KGP、AGP のバージョンで動作するバージョン。AGP 8.11.1 に必要な最小バージョンは Gradle 8.13 であることに注意してください。
アプリケーションがFlutterのリリース間でシームレスに動作するよう、ビルドファイルではFlutter SDKが提供するAPIレベル変数の使用を強く推奨します。本リリースで設定された値は以下の通りです:
flutter.compileSdkVersion(API 36)flutter.targetSdkVersion(API 36)flutter.minSdkVersion(API 24) 以上
エンジン
パフォーマンスオーバーレイ
パフォーマンスオーバーレイが効率化され、SkiaおよびImpellerバックエンド双方でのレンダリング時間が短縮されました。これにより、オーバーヘッドを抑えながらより正確なパフォーマンスデータが得られます。(#176364)
Vulkan および OpenGL ES
Vulkan および OpenGL ES バックエンドに対する多数の修正と改善により、より幅広いデバイスでの安定性とパフォーマンスが向上しました。これには、パイプラインキャッシュ (#176322)、フェンスウェイター (#173085)、およびイメージレイアウト遷移 (#173884) の処理の改善が含まれます。
レンダラーの統合
CanvasKitとSkwasmレンダラーの統合作業を継続中です。今回のリリースでは両者間でより多くのコードを共有するための大幅なリファクタリングを実施し、将来的な一貫性のある体験と開発速度の向上につながります(#174588)。
スレッドマージ
iOSおよびAndroidにおけるスレッドマージの無効化オプションを削除しました。詳細はスレッドマージに関する解説動画をご覧ください。
DevToolsとIDE
実験的ウィジェットプレビュー — 更新
Flutter 3.35では、コミュニティからの初期フィードバックを目的とした実験的機能「ウィジェットプレビュー」が導入されました。Flutter 3.38リリースでは、ウィジェットプレビューに以下の大幅な改善が加えられています:
- IDE統合: VSCodeおよびIntelliJ / Android Studioプラグインの両方が更新され、ウィジェットプレビューの初期サポートが追加されました。IDE内で直接プレビューを表示できるようになり、よりシームレスな開発体験が実現します。
VSCodeに組み込まれたウィジェットプレビュー。
IDE内で使用する場合、ウィジェットプレビュー環境はデフォルトで、現在選択されているソースファイルに基づいて表示されるプレビューをフィルタリングするように設定されています:
- ウィジェットプレビュー環境のテーマ設定と制御の改善:ウィジェットプレビュー環境は、開発環境に合わせるため、ライトモードとダークモード、およびカスタムIDEカラースキームをサポートするようになりました。ウィジェットプレビュー環境内のコントロールも調整され、プレビューのレンダリング領域を拡大するため、より少ないスペースで動作します。
ウィジェットプレビュー環境のカスタムテーマングサポート。
- プレビューの拡張性: Previewアノテーションクラスはfinalマークが解除され、カスタムプレビューアノテーションを作成するために拡張可能になりました。これにより、一般的なプレビュータイプにおける定型コードが削減されます。
カスタム BrightnessPreview アノテーションの例
- MultiPreview のサポート: 新しい
MultiPreview基底クラスにより、単一のカスタム アノテーションから複数のプレビューバリエーションを作成可能
- プレビューグループ:
Previewクラスに追加された新しい group パラメータにより、関連するプレビューをグループ化可能
プレビューグループ内の複数の「Brightness」プレビューの例。
- @Previewアノテーション引数の制限緩和: プライベート定数が
Previewアノテーションの引数としてサポートされました。関数引数(ラッパーやテーマなど)は引き続きパブリックかつ静的にアクセス可能な名前が必要です。
Widget Previewsは実験的機能であり、今後の開発には皆様のフィードバックが不可欠です。APIとユーザーエクスペリエンスは安定しておらず、皆様からの学びに基づき変更されます。
初期フィードバックに基づき、ウィジェットプレビュー体験を改善するためのさらなる強化が計画されています。これには以下が含まれます:
- Flutter DevTools ウィジェットインスペクターのサポート:ウィジェットインスペクターは、ウィジェットプレビュー環境内のプレビューを検査できるよう更新中です。インスペクターをウィジェットプレビューアに直接組み込み、開発環境に関係なく簡単にアクセスできるようにする予定です。
- IDEにおける複数プロジェクトのサポート: 現在のウィジェットプレビューアは、単一プロジェクトまたはPubワークスペース内のプレビュー表示のみをサポートしています。複数のFlutterプロジェクトを含むIDEセッションのサポートについて、現在積極的に調査を進めています(issue #173550)。
- 起動パフォーマンスの改善: 初期起動時間を短縮するためのパフォーマンス改善の機会を調査中です。具体的には以下を含みます:
- 初回実行後にプリコンパイル済みウィジェットプレビュー環境を起動
- 大規模プロジェクトの処理向上のためのプレビュー検出ロジックの並列化
まずはドキュメントを確認し、ご意見をお聞かせください!
- ドキュメントを読む: Flutter ウィジェットプレビュー入門(実験的機能)
- フィードバックの提供:Flutter GitHubリポジトリで問題報告や機能リクエストを提出してください。
- 詳細情報:技術的な詳細については、Flutterウィジェットプレビューアーのアーキテクチャ文書を参照してください。
重要なお知らせ:flutter pub get実行後にウィジェットプレビューアーがクラッシュしたり更新が停止する既知の問題があります。この問題が発生した場合は、プロジェクト内でflutter pub getを実行し、IDEを再起動してください。詳細は#178317を参照してください。
DevToolsの更新
Flutter 3.38では、2025年DevToolsユーザー調査で指摘された主な課題の修正を含みます:
ネットワークパネルの改善
- パネルがネットワークトラフィックを記録している状態を分かりやすく表示 (#9495)
- ネットワークリクエストのコピー&ペーストに関する問題を修正 (#9472, #9482, #9485, #8588)
Flutter Inspector の修正
- ウィジェットを選択した際に、ユーザーのソースコードではなく基盤フレームワークのソースコードが開くことがあるバグを修正しました。(#176530)
- Inspector パネルの上部ボタンが操作不能になることがあるバグを修正しました。(#9327)
非推奨機能と互換性のない変更
今回のリリースでは、Flutter フレームワークの近代化と改善に向けた継続的な取り組みの一環として、いくつかの重要な非推奨機能と互換性のない変更が含まれています。
カスタムビルドスクリプトに影響を与える可能性のある、ビルドおよびツールに関する重要な変更が行われました。Flutter SDK のルートにある version ファイルは削除され、代わりに bin/cache にある新しい flutter.version.json ファイルが使用されるようになりました (#172793)。さらに、AssetManifest.jsonファイルはデフォルトで生成されなくなりました(#172594)。
その他の主な変更点は以下の通りです:
- 動作の予測可能性を高めるため、アクションを含む SnackBar は自動で閉じられなくなりました(#173084)。
OverlayPortal.targetsRootOverlayコンストラクタは、より柔軟なOverlayPortal(overlayLocation: OverlayChildLocation.rootOverlay)に置き換えられ、非推奨となりました。CupertinoDynamicColorのいくつかのプロパティ(withAlphaやwithOpacityなど)は、標準のColorメソッドに置き換えられ、非推奨となりました(#171160)。- Flutter 3.38 では、Android 向け最低限の Java バージョンとして Java 17 を要求します。これは Gradle 8.14 (2025年7月リリース) の最低要件と一致しています。
これらの変更やその他の変更に関する詳細と移行ガイダンスについては、互換性のない変更のページをご覧ください。
おわりに
Flutter 3.38は、日々の開発をより迅速かつ快適にすることを重視しています。これらの機能強化は、ビルドプロセスの効率化を目指しています。本リリースに貢献してくださったコミュニティの皆様の多大なご尽力とフィードバックに心より感謝申し上げます。
変更点の完全な一覧については、詳細な互換性変更とリリースノートを必ずご確認ください。生産性を無料で向上させるには、単にflutter upgradeを実行してください!
-
Next
記事がありません