訳者 はじめに
FltuterとDartの3ヶ月ごとのバージョンアップに対してブログ記事がありますので、そちらの日本語訳をさせていたただいております。誤訳・改善点があればご連絡いただけると助かります。
こちらはKevin Chisholm さんの「What’s new in Flutter 3.35」の記事を訳しました。
はじめに
Flutter 3.35の四半期リリースへようこそ!今回のアップデートは生産性向上に焦点を当てており、ウェブでの状態保持型ホットリロードの安定版リリースと、ウィジェットプレビューの experimental 機能のリリースが含まれています!コミュニティの皆さんのご尽力により、Flutter 3.35には168名のユニークなコントリビューターから1,108件のコミットが寄せられ、そのうち39名が初めて参加してくれました。新機能を見ていきましょう!
Web
ウェブでのStateful Hot Reloadがデフォルトで有効になりました
ウェブにおけるFlutterの重要なマイルストーンとして、この機能のリリースを嬉しく思います。皆様のウェブ開発ワークフローにHot Reloadを追加していただくことを歓迎します。
実験段階でのポジティブなフィードバックと問題報告が大変役立ちました。DartとFlutterのウェブチームは、ホットリロードされたコードのパフォーマンスを向上させつつ、より多くのコード変更が成功裏にホットリロードされるように改善に努めてきました。
私たちの目標は、すべてのプラットフォームでシームレスで一貫したホットリロード体験を提供することです。この機能は現在フラグで無効にできますが、将来は無効化用フラグ自体を削除する予定です。
Wasm ドライラン(dry run)
WebAssembly(Wasm)をデフォルトのウェブビルドターゲットとして有効化する準備として、すべての JS ビルドで Wasm への「ドライラン」コンパイルが実行されます。一連のチェックでアプリケーションの Wasm 対応状況が判定され、結果はコンソールに警告として出力されます。この機能は、--(no-)wasm-dry-run
フラグで有効/無効を切り替えることができます。
新機能
以前は、ウェブ上で状態保持型ホットリロードを有効にするには実験的なフラグを明示的に設定する必要がありました。現在、Flutterウェブアプリケーションを実行する際、状態保持型ホットリロードがデフォルトで利用可能になりました!コマンドラインから実行する場合でも、IDEやコーディングエージェントから起動する場合でも、開発モードで実行すればホットリロードを自由に利用できます。
--web-experimental-hot-reload
フラグはホットリロードを有効にするために必要ではなくなり、ワークフローやIDEの起動設定から削除できます。
フィードバック
開発環境は人それぞれ異なるため、この変更で問題が発生した場合は、一時的にフラグ--no-web-experimental-hot-reload
でホットリロードを無効にできます。問題が見つかった場合は、Dart の web hot reload issue template を使用してバグを報告してください。詳細については、hot reload on the web documentation を参照してください。
次は何が予定されていますか?
現在の主要な作業では、ホットリロードをさらに多くの開発環境に拡張する予定です。これには -d web-server
が含まれます。これにより、ウェブ開発時の生産性がさらに向上すると期待しています。今後のリリースにご注目ください!
フレームワーク
より包括的でアクセスしやすいエクスペリエンス
すべてのユーザーにアプリケーションを利用可能にするのは、Flutter フレームワークの基盤です。このリリースでは、開発者の制御性を高め、支援技術を使用するユーザーのためのすぐに使えるエクスペリエンスを洗練するための、さまざまな改善を行い、当社の取り組みを継続しています。
ウェブ上のより豊かなセマンティクス
Flutter ウェブアプリとスクリーンリーダーやその他のツールとの通信方法に、大きなストライドがありました。国際化(i18n)ユーザー向けに、セマンティクスロケール (#171196) のサポートを追加し、アクセシビリティ機能がユーザーの好みの言語で表示されるようになりました。
アクセシブルなウィジェットを構築するための新しいツール
開発者は、より洗練されたアクセシブルな体験を作成するためのより強力なツールを利用できるようになりました。新しい SemanticsLabelBuilder
ウィジェット(#171683)は、複数のデータポイントを、乱雑な文字列の連結を行うことなく、単一の首尾一貫したアナウンスに統合するプロセスを簡略化します。
複雑なスクロール可能なビューでは、新しいSliverEnsureSemantics
ウィジェット(#166889)を使用することで、Sliverをラップし、スクロールアウトしても Semantics ツリー上に常に残るようにできます。。
コアウィジェットとプラットフォームの改善
このリリースでは、コアウィジェットのアクセシビリティを向上させる多数の修正が含まれています。
- iOSでは、
CupertinoSliverNavigationBar
がアクセシブルなテキストスケーリングを正しく尊重するようになりました(#168866)、およびVoiceOverのタブアクティベーション動作が正しく機能するようになりました(#170076)。 - Androidでは、プラットフォームビューを使用する際のTalkbackの問題が修正されました(#168939)、これはネイティブコンポーネントを埋め込むアプリにとって重要な修正です。
CustomPainter
のセマンティクスプロパティ(#168113)が補完され、カスタム描画UIの完全なアクセシビリティを実現できます。- テキスト選択ツールバーが右から左(RTL)言語で正しく配置され、グローバルユーザー体験が向上しました(#169854)。
Material と Cupertino: より強力な機能と洗練されたデザイン
Material と Cupertino ライブラリは継続的に進化し、アプリの見た目と操作性をより細かく制御できるようになりました。
新しいコンポーネントと機能強化
新しいコンポーネントを追加し、既存のコンポーネントに大幅な機能強化を実施しました。
- DropdownMenuFormField (#163721): M3
DropdownMenu
をフォームに直接組み込むことが可能になりました。 - スクロール可能な NavigationRail (#169421):
NavigationRail
は、画面に表示できないほどの行き先がある場合にスクロール可能に設定できます。 - NavigationDrawer のヘッダーとフッター (#168005):
NavigationDrawer
にヘッダーとフッターを追加でき、レイアウトの柔軟性が向上しました。 - CupertinoExpansionTile の導入 (#165606): 新しい
CupertinoExpansionTile
ウィジェットを使用して、展開および折りたたみ可能なリスト項目を作成できます。
より高い忠実度とインタラクティブ性
今回のリリースの主要なテーマは、ウィジェットを可能な限りピクセルパーフェクトに磨き上げ、ネイティブの対応物と同様の動作の一貫性を実現することでした。
- 多くの Cupertino ウィジェットが、
RSuperellipse
形状(#167784)を採用し、iOS ユーザーが期待する連続した角のデザインを実現しました。 - アプリをより生き生きとネイティブに感じさせるため、
CupertinoPicker
(#170641)やCupertinoSlider
(#167362)などの主要なインタラクティブコンポーネントにハプティックフィードバックを追加しました。 Slider
の値インジケーターは、常に表示されるように設定可能になりました(#162223)。
フレームワークのその他の機能
このリリースでは、フレームワークの最も重要な部分に対して、複雑なUIを細やかに制御するための強力な新機能と改善が多数追加されました。
より強力なSliver
高度なスクロール体験を構築する開発者向けに、Sliverの**ペイント順序(またはZ順序)**を明示的に制御できるようになりました(#164818)。これにより、他のSliverと重なる「スティッキー」ヘッダーなどの高度な効果を、視覚的な不具合なく正しく実装できます。
ナビゲーションとフォームのより詳細な制御
アプリのナビゲーションとルーティングを制御するための新しい機能を複数追加しました。
- フルスクリーンダイアログ (#167794): ModalRoute(およびそのすべての派生クラス)と
showDialog
にfullscreenDialog
プロパティが追加されました。これにより、ダイアログルートへのナビゲーション動作をカスタマイズできます。 - フォームの改善 (#167060):
FormField
にonResetコールバックが追加され、フォームのクリアロジックを処理しやすくなりました。
マルチウィンドウサポート(エンジン)
Canonicalのチームは、マルチウィンドウアプリケーションのサポート追加において着実な進展を続けています!今回のリリースでは、WindowsとmacOSでのウィンドウの作成と更新に関する基盤ロジックが実装されました(#168728)。今後のリリースではLinuxの対応が追加され、マルチウィンドウ機能の公開に向けた実験的なAPIが導入されます。お楽しみに!
テキスト入力と選択の改善
テキスト入力はユーザー体験の基盤となる部分であり、今回のリリースではより強力で予測可能な機能を追加しました。
- より統一されたジェスチャーシステム:
PositionedGestureDetails
インターフェース(#160714)の導入により、ポインターベースのジェスチャーの詳細が統一され、より汎用的なジェスチャー処理コードを書くことが可能になりました。 - iOSの単一行スクロール (#162841): ネイティブのiOS動作と一致させるため、単一行のテキストフィールドはユーザーによるスクロールが不可になりました。
Androidのホーム/エンドキーサポート (#168184): AndroidでHome
とEnd
のキーボードショートカットをサポートしました。
今後の展望: Flutter のデザインライブラリの分離
Flutter エコシステムが成長し成熟するにつれ、コアフレームワークも同様に進化する必要があります。この成熟のプロセスにおける重要な要素は、Flutter のすべての部分がコミュニティのニーズに最も適したペースで進化できるようにすることです。
この方針に沿って、Material と Cupertino ライブラリをコア Flutter フレームワークから分離し、独立したパッケージに移動するプロセスを開始しました。この作業は始まったばかりであり、これまで通り、コントリビューターコミュニティとのオープンな協業のもと進めています。
なぜ変更されるのか?
この進化により、MaterialとCupertinoライブラリは、四半期ごとのFlutterリリースサイクルに依存せず、より頻繁にイノベーションとアップデートをリリースできるようになります。また、コミュニティは、日常的に使用するUIライブラリに直接貢献できるようになります。コアフレームワークにとっては、より焦点を絞った安定した基盤が実現します。
この変更はあなたにとって何を意味しますか?
ワークフローに即時的な変更はありません。これは長期プロジェクトの始まりであり、最終的な移行を可能な限りスムーズにすることをコミットしています。進捗を追跡し、計画の詳細を学び、フィードバックを共有してください。
- 詳細なビジョンと理由については、以下のリンクを参照してください:Decoupling Design in Flutter(Flutter におけるデザイン分離).
- フィードバックを提供し、作業の調整に協力するには、GitHubでのディスカッションに参加してください。
これは成熟した活気あるエコシステムにおける自然な進化です。この変更は、より強固で柔軟なMaterialとCupertinoライブラリを実現し、コミュニティ協業の機会をさらに拡大すると信じています。
iOS
iOS 26およびXcode 26ベータ対応
FlutterのiOS 26ベータ版との互換性向上に積極的に取り組んでいます。最新ベータ版でアプリやプラグインをテストし、発見した問題を報告してください。進捗状況や既知の問題の一覧は、この GitHub プロジェクトで確認できます。
Android
機密コンテンツの保護
Androidでは、Flutter アプリで SensitiveContent
ウィジェットを使用することで、メディア投影中にユーザーの機密コンテンツを保護できるようになりました。API 35以降では、画面共有中に画面全体を非表示にし、データ盗難を防止する機能も利用可能です。この機能の詳細と使用方法については、Protect sensitive content を参照してください。
エンジン
一般的なエンジン更新
3.35では、Impellerのパフォーマンスと互換性の向上に引き続き注力しています。iOSでのUISceneDelegate
の採用やツールの改善にも投資が行われました。主な追加機能は以下の通りです。
エンジン
- 最適化: 初期化を新しいスレッドで実行することで、アプリ起動時間を短縮しました。
Impeller
- 最適化: 中間ターゲットからMSAAを削除しました。
- 忠実度: 損失のあるテクスチャ圧縮のデフォルト設定を削除しました。
- 修正:
MaskFilter
が以降の描画で固まる問題を修正しました。 - 最適化: パスレンダリングを最適化しました。
- 新機能: Vivante GPUのサポートを追加しました。
- 最適化:
DrawImageNine
は高速なPorter Duffブレンドを使用するようになりました。 - 修正: VideoPlayerのメモリリークを修正しました。
- 忠実度: 大きなシグマでのよりクリーンなブラーを実現するため、ブラー半径の計算を改善しました。
iOS
- 修正:
WebView
をClipRSuperellipse
でラップした際のクラッシュを解決しました。 - 修正: リモート通知からバックグラウンドでアプリを起動した際に画像デコードが機能するようになりました。
- 再有効化:テキストフィールドに Live Text(OCR) を再有効化しました。
Android
- 移行: テンプレートプロジェクトを Android API 24 に移行しました。
- 修正: Android 14 以下の背景画像リーダーからのクラッシュを修正しました。
- 修正: OpenGLES Impeller のフラグメントシェーダーにおける一様配列を修正しました。
- 修正: OpenGLES Impeller のフラグメントシェーダーパスが逆転していた問題を修正しました。
- 修正:
FlutterEngineGroup
でのクラッシュを修正しました。.
macOS
- 修正: P3 カラーの表示を修正しました。
DevTools と IDEs
Dart と Flutter MCP サーバーが安定したチャネルに移行しました
実験的な Dart と Flutter MCP サーバーが Dart SDK の安定したチャネルで利用可能になりました。これは、すべての Dart と Flutter 開発者向けに、高度に生産的で AI 支援型の開発体験を実現するビジョンにおける重要なステップです。
AIコーディングアシスタント向けの強化されたDartとFlutterコンテキスト
DartとFlutter MCPサーバーはブリッジとして機能し、AIコーディングアシスタントがDartとFlutterのツールチェーン経由でプロジェクトのコンテキストにさらにアクセスできるようにします。コードの提案だけでなく、AIアシスタントはプロジェクトを深く理解し、代わりにアクションを実行できます。これにより、AIがメカニズムを処理する間、あなたは目標に集中できます。
DartとFlutter MCP Serverを使用すると、AIアシスタントに次のようなことを依頼できます:
- 実行時エラーの修正: ライブウィジェットツリーを検査し、Flutter RenderFlexオーバーフローを特定し、適切な修正を自動的に適用します。
- コードの記述と修正: 新機能のボイラープレートを生成し、その過程で発生する分析エラーを自動的に修正します。
- さらに多くの機能…
依存関係の管理: 特定のタスクに最適なパッケージをpub.devで探し、
pubspec.yaml
に追加し、pub get
を実行します。
お気に入りのAIツールとの連携
Gemini Code Assist、Firebase Studio、Gemini CLI、GitHub Copilot、Cursorなど、お気に入りのAIツールをDartとFlutter MCP Serverに接続することで、生産性を新たなレベルに引き上げることができます。
DartとFlutter MCP Serverが可能な機能や、お好みのエディターでの設定方法に関する詳細なガイドは、当社の詳細なブログ記事「Dart & Flutter開発体験を強化するDartとFlutter MCP Server」と「ドキュメント」をご確認ください。
DartとFlutter MCP Serverにより解決されたレイアウトの問題 (注: 簡潔さを重視し、この録画の一部は速度を上げています。)
DevToolsの更新
DevToolsの一般機能、UX、パフォーマンスに関する更新を継続的に実施しています。Flutter 3.35に含まれるすべての更新内容については、DevToolsのリリースノート(2.46.0、2.47.0、2.48.0)をご確認ください。
実験的なウィジェットプレビューが追加されました!
コミュニティから多く要望されていた機能である、他の現代的なUIツールキットで利用可能なツールと同様に、ウィジェットを孤立した状態でプレビューする機能が追加されました。皆様の声を聞き、本日、この機能の最初のステップとして、Flutter Widget Previewsの早期実験版を安定チャネルで提供開始しました!
Flutterのステートフルホットリロードは、実行中のアプリケーションで迅速に反復開発を行うための最先端の機能です。ウィジェットプレビューは、フルアプリから完全に分離されたサンドボックス環境でウィジェットを可視化・テストできる機能を追加し、この機能を補完します。デザインシステムを構築する際や、画面サイズ、テーマ、テキストスケールなど、複数の設定を同時に並べてテストする際などに、この機能は極めて有用です。
Widget Previewsでのテーマ実験
これは早期の実験的なリリースであり、今後の機能向上に皆様のフィードバックが不可欠です。APIとユーザー体験は未完成であり、皆様のフィードバックに基づいて変更される予定です。早期のフィードバックに基づき、既に以下の機能強化を計画しています:
- IDEとの統合強化: 現在の独立したブラウザウィンドウから離れ、VS Code、Android Studio、IntelliJ IDEA内に埋め込まれたプレビューパネルをオプションで提供するように計画しています。
- 汎用テーマサポート: このブログ記事で述べたように、MaterialとCupertinoのデザインライブラリをコアフレームワークから分離する計画を進めていく中で、Widget Previewsはカスタムおよび汎用デザインシステムをより効果的にサポートするように進化していきます。
この機能を皆様の手元に届けられることを大変楽しみにしています。開始するには、ドキュメントを確認し、ご意見をお聞かせください!
- ドキュメントを読む: Flutter Widget Previewer (Experimental) の開始方法
- フィードバックを送信: 問題報告や機能リクエストは、Flutter GitHub リポジトリに投稿してください。
- 詳細を学ぶ: 技術的な詳細については、Flutter Widget Previews アーキテクチャ ドキュメントを参照してください。
Analysis Server の速度改善
dart コマンドラインツールで分析サーバーを使用するコマンドは、現在 AOT コンパイルされた分析サーバーのスナップショットを実行します。これにはdart analyze
、dart fix
、およびdart language-server
が含まれます。
AOT コンパイルされた分析サーバーのスナップショットを使用する場合、機能的な違いはありませんが、さまざまなテスト結果から、プロジェクトの分析時間が大幅に短縮されることが確認されています。この更新後にサンプルパッケージで一般的なコマンドを実行した際の統計の変更を確認してください:
ソースコードによっては結果が異なりますが、一般的にはフォーマットのような短いコマンドは大幅に短縮され、分析のような長時間実行されるコマンドはほぼ50%高速化されています。これにより、ツールの日常的な使用感が大幅に改善され、CIシステムで実行される一般的なテストワークフローに大きな影響を与える可能性があります。
Android Studio と JetBrains IDE プラグインのアップデート
Flutter IntelliJ Plugin のバージョン M87 のリリースに伴い、Android Studio の Meerkat と Narwhal への対応が追加されました。このバージョンでは、Flutter プラグインを CLion、GoLand、PyCharm を含む複数の JetBrains IDE に追加でインストールできるようになりました。対応製品の一覧は、こちらをご覧ください。Alex Li(FlutterとDartのGDE)に感謝します。彼のPR #7949とチームとの協力が、プラグインでサポートされるJetBrains IDEの数を拡大する原動力となりました。
すべての更新内容と修正内容は、変更履歴とこちらのイシューをご覧ください。最新の更新を取得するには:設定 > プラグイン > Flutter > 更新。
開発チャネルへのサブスクリプションをご検討ください。最新の更新が毎週リリースされます。詳細な手順は こちら をご覧ください。
_Flutter IntelliJ Plugin バージョン M87 でサポートされる IDE の全一覧。_
重大な変更と非推奨機能
このリリースには、Flutter フレームワークの現代化と改善に向けた継続的な取り組みの一環として、重要な非推奨機能と重大な変更が含まれています。
- コンポーネントテーマの標準化: このリリースは、コンポーネントテーマの標準化という大規模な長期プロジェクトの完了をマークします。テーマの一貫性を向上させ、Material 3 と一致させるため、
AppBarTheme
、BottomAppBarTheme
、InputDecorationTheme
などのコンポーネントテーマが、新しいデータ指向の…ThemeData
クラスを基にリファクタリングされました。 - ラジオウィジェットのリデザイン:
Radio
、CupertinoRadio
、およびRadioListTile
ウィジェットは、アクセシビリティの向上を目的としてリデザインされました。groupValue
およびonChanged
プロパティは、ラジオボタンの状態を管理する新しいRadioGroup
ウィジェットに置き換えられました。 - FormウィジェットとSliver:
Form
ウィジェットは、直接Sliverとして使用できなくなりました。Form
をCustomScrollView
に含めるには、SliverToBoxAdapter
でラップする必要があります。 - セマンティクスエレベーションと厚さの削除:
SemanticsConfiguration
とSemanticsNode
のelevation
とthickness
プロパティが削除されました。これらのプロパティは未実装であり、削除によりAPIが簡素化されます。 - DropdownButtonFormField の value の廃止:
DropdownButtonFormField
のvalue
パラメーターは廃止され、動作を正確に反映するためにinitialValue
にリネームされました。
詳細と移行ガイドについては、当社のbreaking changes ページをご確認ください。
Android での 32 ビット x86 アーキテクチャの廃止
Flutter は Android での 32 ビット x86 アーキテクチャを廃止しました。ほとんどの開発者には影響はありません。これは主に古い x86 ベースの Android エミュレーターと一部の物理デバイスに影響します。32 ビット ARM と 64 ビット x86_64 エミュレーターおよびデバイスは引き続きサポートされます。詳細な技術的な説明は、Dart GitHub の廃止予定イシューでご確認ください。
古い Flutter SDK に対する IDE サポートの廃止
このリリースで、Flutter SDK 3.13以前のバージョンに対するIDEサポートが廃止されます。
次の安定リリースでは、Flutter SDK 3.16以前のバージョンが廃止されます。
Flutterの廃止ポリシーの詳細については、Flutter互換性ページをご覧ください。IDEに関する廃止ポリシーの詳細については、Flutter開発ツールのSDKサポートページをご覧ください。
古いDartまたはFlutter SDKを使用しているユーザーは、必ず互換性のあるバージョンをダウンロードしてください。
最小Android SDKが変更されました
Flutterがサポートする最小Android SDK(flutter.minSdkVersion
で指定)は、API 24(Android 7)に変更されました。この値をflutter.minSdkVersion
以外の値に変更している場合は、少なくとも24に更新する必要があります。
また、FlutterのAndroid固有の依存関係の一部について、最小要件が引き上げられました。Flutterツールは、これらの値を上げる必要がある場合、およびアップグレード方法のガイドラインを表示します(ツールが警告を表示しない場合は、何の操作も必要ありません)。
現在、以下の要件を満たす必要があります:
- Gradleバージョン:
8.7.0
- Android Gradle Plugin (AGP):
8.6.0
- Java:
17
AGPとGradleの問題を解決するには、Android StudioでAGPアップグレードアシスタントを実行するか、コマンドラインから実行してください。
pluginClassの非推奨: なし
pluginClass: none
のサポートは、Flutterの今後のバージョンで削除されます。このフィールドを使用しているプラグインは、将来の互換性を確保するために削除する必要があります。
すべての最近の Flutter バージョンでは、そのプラットフォームにネイティブコードが存在しない場合、pluginClass:
エントリを省略できます。
結論
Flutter 3.35 は、より良い開発者体験を築くための共同の努力の成果です。Canonical を含むコミュニティからの貢献とフィードバックに感謝しています。これらの貢献により、ウェブホットリロードやウィジェットプレビューなどの機能が実現しました。皆さんの情熱が Flutter を前進させています。これらの新しいツールで作成される素晴らしい作品を見るのを楽しみにしています。
すべての変更点の完全なリストを確認するには、詳細なリリースノートと変更履歴をご確認ください。Flutter 3.35 のすべての機能を使用するには、flutter upgrade
を実行してください。 皆さんの作品を見るのを楽しみにしています!