Flutter 3.41 は2026年2月11日に出た安定版で、Dart 3.11.0 を同梱しています。パッチは 3.41.9(2026年4月30日・Dart 3.11.5)が最終で、次の 3.44.0 は2026年5月18日に出ました。3.41 でいちばん影響が大きいのは、iOS アプリを UIScene ライフサイクルへ移す処理が安定版で既定オンになった点です。
この記事では、公式ブログ「What’s new in Flutter 3.41」、破壊的変更の一覧、flutter/flutter のタグ 3.41.9 の CHANGELOG と、タグ 3.41.0 のツール側ソースを根拠に、3.41 で変わったことと 3.41.0〜3.41.9 のパッチ内容を整理します。掲載したコードは Flutter 3.41.9 で flutter analyze と flutter test にかけて動作を確かめました。現行の安定版で変わった点はFlutter 3.47とは?material_ui分離とIntel Mac終息で決まる移行判断【2026年8月時点】で扱っています。
まとめ:Flutter 3.41 で押さえる変更点
- 3.41.0 は2026年2月11日公開・Dart 3.11.0 同梱。最終パッチの 3.41.9 は Dart 3.11.5 です。Dart 3.11 には言語仕様の変更がありません。
- iOS の UIScene 移行(
enable-uiscene-migration)が安定版で既定オンになりました。3.38 では手動で有効にする必要がありました。新規プロジェクトのInfo.plistには最初からUIApplicationSceneManifestが入ります。 - Android Gradle Plugin(AGP)9 へは上げないよう公式ブログが警告しています。3.41.0 のテンプレートは Gradle 8.14・AGP 8.11.1・Kotlin 2.2.20 です。
- 破壊的変更は5件。可変フォントの太さ、
containsSemanticsとfindChildIndexCallbackの非推奨化、Material の配色計算、Linux のスレッド統合です。 - 新しい API は
Navigator.popUntilWithResult、RepeatingAnimationBuilder、DropdownMenu.selectOnly、プラットフォーム別アセット、decodeImageFromPixelsSyncなど。 - デスクトップのマルチウィンドウは、3.41 の安定版チャンネルでは有効にできません(機能フラグが master チャンネル限定)。
- 3.44.0 が出た後、3.41 系にはパッチが出ていません。いま 3.41 を使うなら 3.41.9 に固定し、3.44 以降への移行計画を立てるのが現実的です。
以下、パッチ履歴、リリース計画、iOS と Android の変更、破壊的変更、新しい API、デスクトップ、更新の判断と手順の順に説明します。
Flutter 3.41.0〜3.41.9 のリリース日と Dart バージョン
リリース日と同梱 Dart は Flutter の配布情報(releases_macos.json。一覧はSDK アーカイブのページでも見られます)から、各パッチの修正内容はタグ 3.41.9 の CHANGELOG から取りました。日付は UTC です。
| バージョン | 公開日(UTC) | Dart | 主な修正 |
|---|---|---|---|
| 3.41.0 | 2026-02-11 | 3.11.0 | 初回の安定版 |
| 3.41.1 | 2026-02-13 | 3.11.0 | テストのカバレッジ計測が壊れる問題 |
| 3.41.2 | 2026-02-19 | 3.11.0 | --web-define が無視される問題ほか |
| 3.41.3 | 2026-03-02 | 3.11.1 | Windows のアイドル時 CPU 使用率 |
| 3.41.4 | 2026-03-04 | 3.11.1 | iOS プラグインのライフサイクル登録でクラッシュ |
| 3.41.5 | 2026-03-18 | 3.11.3 | Impeller で円の描画が乱れる問題 |
| 3.41.6 | 2026-03-26 | 3.11.4 | Android 16 の3月更新で ANR |
| 3.41.7 | 2026-04-16 | 3.11.5 | Xcode 26.4 以降の実機デバッグでクラッシュ |
| 3.41.8 | 2026-04-27 | 3.11.5 | iOS 実機の profile モードで Dart VM に接続できない |
| 3.41.9 | 2026-04-30 | 3.11.5 | アニメーション PNG の整数オーバーフロー |
| 3.44.0(次版) | 2026-05-18 | 3.12.0 | 3.41 系の後継 |
Android の ANR、iOS の実機デバッグ、ビルド失敗に関係する修正を次に挙げます。どれかに当てはまるなら、3.41.0〜3.41.6 のまま使い続ける理由はありません。
- 3.41.6:Android 16 の2026年3月セキュリティ更新を当てた端末で、画面オフ時にデッドロックが起き ANR になることがありました。細い線の円がギザギザになる問題も同じ版で直っています。
- 3.41.7:Xcode 26.4 以降で iOS 実機デバッグをするとアプリが頻繁に落ちる問題と、iOS/macOS ビルドが git の multi-pack-index エラーで失敗する問題を修正しました。
- 3.41.4:Xcode 26 で iOS シミュレーター向けにビルドすると、arm に対応していない CocoaPods 依存があるだけで失敗する問題を修正しました。Flutter Web の Skwasm でのクラッシュもこの版で直っています。
3.41.1 の修正は flutter_test が test_api の版を固定していたためにカバレッジ計測が壊れた件と、Dart の test パッケージ 1.29 がテスト出力に空行を足して既存テストが落ちた件です。CI でテスト出力を文字列比較している場合は 3.41.0 を避けてください。
なお、Flutter の安定版に 3.4 系はありません。安定版は 3.3.10 の次が 3.7.0 です。3.4 の番号が付いているのは 3.4.0-17.1.pre などのベータ版のプレリリースだけで、「3.4.4」という版はプレリリースにもありません。
3.41 で始まった公開リリースウィンドウと2026年の安定版計画
3.41 の公式ブログは、新機能より先に「公開リリースウィンドウ」を発表しています。各安定版のブランチを切る日(ブランチカットオフ)を事前に公開し、その日までに Flutter の master(Dart は main)へマージされた変更は次の安定版に入り、それ以降は次の周期に回る、という取り決めです。2026年の計画は次のとおりで、実際の公開日はリリース情報から取りました。
| 版 | 予定月 | ブランチカットオフ | 実際の公開日(UTC) |
|---|---|---|---|
| 3.41 | 2月 | 1月6日 | 2026-02-11 |
| 3.44 | 5月 | 4月7日 | 2026-05-18 |
| 3.47 | 8月 | 7月7日 | 2026-08-12 |
| 3.50 | 11月 | 10月6日 | 未公開(2026-10-09時点) |
3.44 と 3.47 は予定月どおりに出ました。受託開発やアプリの保守計画では、この表をそのまま「SDK 更新の検証枠」を確保する月として使えます。上流に修正を送っている場合は、カットオフ日から逆算すれば、その修正がどの安定版に入るかを読めます。
同じブログで、Material と Cupertino を SDK 本体から別パッケージへ切り出す作業を続けていると説明しています。3.41 の時点では分離は完了しておらず、進捗は issue #101479 で追う形でした。分離が形になったのは 3.47 で、material_ui と cupertino_ui の扱いは3.47 の記事で解説しています。
iOS の変更:UIScene 移行の既定化と Swift Package Manager の状況
UIScene 自動移行の既定化と適用条件
Flutter ツールの機能フラグを定義する features.dart を見ると、uiSceneMigration はタグ 3.38.0 では stable: FeatureChannelSetting(available: true)(使えるが既定オフ)でした。タグ 3.41.0 では enabledByDefault: true が付き、安定版でも既定で有効です。有効なとき、flutter run や flutter build ios は可能ならアプリを自動で UIScene ライフサイクルへ移行し、できない場合は手動移行の手順を警告で出します。
新規作成のテンプレートも変わりました。3.41.0 の Info.plist テンプレートには UIApplicationSceneManifest が入り、UIApplicationSupportsMultipleScenes は false です。最低 iOS バージョン(IPHONEOS_DEPLOYMENT_TARGET)は 13.0 のままです。
既存アプリで注意したいのは、自動移行が働かない条件です。Info.plist に UIApplicationSceneManifest が既にあると中身を見ずにスキップし、AppDelegate を過去のテンプレートから書き換えていると移行されません。条件の詳細と手動移行の手順はFlutter UIScene移行手順|SceneDelegate対応と自動移行が効かない条件【3.38〜3.47・Xcode 27】にまとめています。自動移行を止めたい場合は次のコマンドで無効にできます。
flutter config --no-enable-uiscene-migration
止めるのは一時的な回避にとどめてください。Apple は iOS 27 のリリースノートで、最新の SDK でビルドしたアプリはシーンベースのライフサイクルを採用しないと起動しないと明記しています。iOS 27 SDK でビルドし直す時点で、移行は避けられません。3.41.4 で直った「ライフサイクルイベントの処理中にプラグインが登録するとクラッシュする」問題もこの移行に関係するため、UIScene を有効にしたまま 3.41 を使うなら 3.41.4 以降が前提です。
Swift Package Manager の既定オフと有効化の手順
公式ブログはプラグイン作者に Swift Package Manager(SwiftPM)への移行を強く勧めていますが、3.41.0 の swiftPackageManager フラグは安定版で available: true のみで、既定オフです。アプリ側で使うには明示的に有効にします。
flutter config --enable-swift-package-manager
SwiftPM が既定になったのは次の 3.44 です。CocoaPods 依存が残るプラグインを抱えているなら、3.41 の間に有効化してビルドが通るかを確かめておくと、3.44 への更新で詰まりません。移行期限の整理はFlutter 3.44とは?SPM既定化とHCPPで変わる移行判断【2026年7月時点】、SwiftPM 自体の使い方はSwift Package Manager入門|使い方とPackage.swift、CocoaPods移行をSwift 6世代で解説を参照してください。
Android の変更:AGP 9 非対応とテンプレートのビルド設定
3.41 の公式ブログには、AGP 9 についての警告があります。原文は「Do not update your Flutter app for Android to AGP 9」で、プラグインの AGP 9 への移行と、プラグインを使う Flutter アプリを AGP 9 で動かすことはまだサポートされていません(issue #181383)。Android Studio が AGP の更新を勧めてきても、3.41 のプロジェクトでは見送ってください。
タグ 3.41.0 の gradle_utils.dart と FlutterExtension.kt から、新規プロジェクトのテンプレートが使う値を抜き出すと次のとおりです。
| 項目 | 3.41.0 の値 |
|---|---|
| Gradle(テンプレート既定) | 8.14 |
| Android Gradle Plugin(テンプレート既定) | 8.11.1 |
| Kotlin Gradle Plugin(テンプレート既定) | 2.2.20 |
| flutter analyze –suggestions が Kotlin 互換を把握する AGP の上限 | 8.11.1 |
| flutter.minSdkVersion | 24 |
| flutter.compileSdkVersion/targetSdkVersion | 36 |
| flutter.ndkVersion | 28.2.13676358 |
最低 SDK の 24(Android 7.0)は 3.41 で引き上げられたものではなく、タグ 3.38.0 でも同じ 24 です。3.41 への更新で minSdkVersion を触る必要はありません。
既存プロジェクトでビルドが止まるかどうかは、Flutter の Gradle プラグイン(DependencyVersionChecker.kt)の基準で決まります。3.41 では Gradle 8.3 未満、AGP 8.1.1 未満、Java 17 未満、Kotlin Gradle Plugin 1.8.10 未満、minSdkVersion 23 未満がエラーです。Gradle 8.7 未満、AGP 8.6 未満、Kotlin Gradle Plugin 2.1.0 未満、minSdkVersion 23 は警告にとどまりますが、警告の水準は次の版でエラーに上がる候補なので、3.41 のうちに上げておくと後が楽です。
ほかに、新しく作るプラグインプロジェクトの Gradle スクリプトが Kotlin DSL(build.gradle.kts)既定になりました。既存プラグインの Groovy スクリプトはそのまま動きます。
既存のネイティブアプリに Flutter の画面を埋め込む add-to-app では、Flutter ビューが中身に合わせて自分の大きさを決められるようになりました。iOS は FlutterViewController.isAutoResizable を true に、Android はマニフェストで content sizing を有効にして FlutterView の幅か高さを wrap_content にします。ルートに ListView や LayoutBuilder のような大きさの決まった制約を前提とするウィジェットを置くと衝突するので、ネイティブのスクロールビューの中に Flutter を差し込む用途で使います。
Flutter 3.41 の破壊的変更5件と移行コード
破壊的変更の一覧で「Released in Flutter 3.41」に載っているのは次の5件です。
| 変更 | 影響する対象 | 対応 |
|---|---|---|
| FontWeight が可変フォントの太さも設定 | 可変フォント利用アプリ | 表示を確認し値を調整 |
| containsSemantics の非推奨化 | アクセシビリティのテスト | dart fix --apply |
| findChildIndexCallback の非推奨化 | ListView/SliverList.separated | findItemIndexCallback へ |
| Material の配色計算の更新 | ColorScheme.fromSeed など | 必要なら色を上書き |
| Linux の UI/プラットフォームスレッド統合 | Linux デスクトップ | 原則不要 |
FontWeight による可変フォントの太さ指定
TextStyle の fontWeight が、可変フォントの wght 軸も設定するようになりました。これまでは FontVariation('wght', ...) を別に指定しないと可変フォントの太さは変わりませんでした。可変フォントを使っていて FontVariation を付けていなかったアプリは、3.41 で文字の太さが変わります。元の見た目に戻すには、意図した太さの FontWeight を明示します(既定の太さなら FontWeight.normal)。
同時に FontWeight は 1〜1000 の任意の整数で作れるようになり、FontWeight.index は非推奨になりました。太さの値は FontWeight.value で取ります。
const w = FontWeight(450);
print(w.value); // 450
print(FontWeight.lerp(FontWeight.w400, FontWeight.w500, 0.3)?.value); // 430
FontWeight.lerp の結果も w100〜w900 の9段階に丸められなくなったので、太さをアニメーションさせている画面は中間の値で描かれます。
containsSemantics から isSemantics への移行
flutter_test の部分一致マッチャー containsSemantics が非推奨になり、isSemantics に置き換わりました。指定しなかったプロパティを既定値と照合したいときは完全一致の matchesSemantics を使います。dart fix --apply で自動移行できます。
final handle = tester.ensureSemantics();
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: ElevatedButton(onPressed: () {}, child: const Text('送信')),
),
));
expect(
tester.getSemantics(find.byType(ElevatedButton)),
isSemantics(label: '送信', isButton: true),
);
handle.dispose();
findItemIndexCallback への移行とインデックス計算の変更
ListView.separated と SliverList.separated の findChildIndexCallback は、区切り線を含む子の番号を返す仕様だったため、項目の番号を2倍して返す回避策が必要でした。新しい findItemIndexCallback は項目の番号をそのまま返します。両方を同時に渡すとアサーションエラーになるので、置き換えるときは2倍する処理も消してください。
ListView.separated(
itemCount: items.length,
findItemIndexCallback: (Key key) {
final int index = items.indexOf((key as ValueKey<String>).value);
return index == -1 ? null : index; // 2倍しない
},
itemBuilder: (context, index) => ListTile(
key: ValueKey<String>(items[index]),
title: Text(items[index]),
),
separatorBuilder: (context, index) => const Divider(),
)
Material の配色計算と生成色の変更
material_color_utilities が 0.11.1 から 0.13.0 に上がり、ColorScheme.fromSeed、ColorScheme.fromImageProvider、ThemeData(colorScheme: ...) で生成する onPrimaryContainer・onSecondaryContainer・onTertiaryContainer・onErrorContainer の色が変わります。ブランドカラーを厳密に合わせている画面は、スクリーンショットテストで差分を確認し、必要ならこの4色を生成後に上書きします。
Linux の UI・プラットフォームスレッド統合
Linux では UI スレッドとプラットフォームスレッドが既定で統合されました。iOS と Android は 3.29、macOS と Windows は 3.35 で統合済みで、3.41 で全プラットフォームがそろいました。移行作業は原則不要で、不具合があれば issue #150525 へ報告するよう案内されています。モバイルでの統合の経緯はFlutter 3.29の変更点|スレッド統合・iOSのSkia削除と3.29.3までの修正履歴で扱っています。
Dart 3.11 で注意する変更
Dart 3.11.0 に言語の変更はありません。Flutter Web を Wasm でビルドしている場合だけ注意が要ります。dart2wasm が dart:js_util のサポートをやめたため、dart:js_util や package:js に依存するコードは Wasm ビルドでコンパイルできなくなりました。dart:js_interop への移行が必要です。Wasm と CanvasKit の使い分けはFlutter Webとは?CanvasKitとWasmの描画差・SEO制約・採用条件【2026年8月時点】を参照してください。
ツール面では、pub のワークスペースで pkgs/* のようなグロブ指定が使えるようになり(含む側の Dart SDK 制約が 3.11.0 以上のとき)、pub キャッシュの不要分を消す dart pub cache gc が追加されました。lint では prefer_final_parameters などが非推奨になっています。
3.41 で増えた API:画面遷移・アニメーション・アセット・シェーダー
複数の画面をまとめて閉じながら値を返せるメソッドです。従来の popUntil は閉じた画面に null を返すだけでした。popUntilWithResult は、条件に合う画面まで戻り、最後に閉じた画面の push が返す Future に値を渡します。
// ホーム → 入力画面(step1) → 確認画面(step2) と進んだ状態で
Navigator.popUntilWithResult<String>(
context,
(route) => route.isFirst,
'done',
);
// step1 を push した側の Future が 'done' を受け取る
// step2 を push した側の Future は null
申し込みフォームのような多段の画面で、最後の画面から最初の呼び出し元に結果を返すときに使います。
RepeatingAnimationBuilder の繰り返し描画と DropdownMenu の選択専用入力
RepeatingAnimationBuilder は、読み込み中の点滅のような繰り返しアニメーションを AnimationController なしで書ける部品です。repeatMode: RepeatMode.reverse で往復します。
RepeatingAnimationBuilder<double>(
animatable: Tween<double>(begin: 0.3, end: 1.0),
duration: const Duration(milliseconds: 800),
repeatMode: RepeatMode.reverse,
builder: (context, value, child) => Opacity(opacity: value, child: child),
child: const Text('読み込み中'),
)
DropdownMenu に追加された selectOnly を true にすると、内部のテキスト欄が読み取り専用になり、一覧から選ぶだけの「select」として振る舞います。既定は false です。ほかに CarouselView.builder、DropdownMenuFormField の errorBuilder、RawAutocomplete の OptionsViewOpenDirection.mostSpace、CupertinoSheet のドラッグハンドル(showDragHandle)も 3.41 で入りました。アクセシビリティでは、CircularProgressIndicator と LinearProgressIndicator の進捗を支援技術が読み上げられるようになっています。
プラットフォーム別アセットによるバンドルの絞り込み
pubspec.yaml のアセットに platforms を書くと、そのプラットフォームのビルドにだけ含められます。デスクトップ用の大きな画像をモバイルのバイナリから外す用途です。
flutter:
assets:
- path: assets/logo.png
- path: assets/web_worker.js
platforms: [web]
- path: assets/desktop_icon.png
platforms: [windows, linux, macos]
platforms を書かないアセットは従来どおり全プラットフォームに入ります。
シェーダー用画像の同期生成と BackdropFilter のにじみ修正
シェーダー周りでは、decodeImageFromPixelsSync による同期的な画像デコードが入り、生成したテクスチャを同じフレームでサンプラーに渡せるようになりました。従来は1フレーム遅れることがありました。1ピクセル最大128ビット(RGBA各32ビット浮動小数点)の高精度テクスチャ(ui.TargetPixelFormat.rgbaFloat32)にも対応し、写真フィルターのルックアップテーブルを高い精度で持てます。
iOS では Impeller の改善で、BackdropFilter を使った半透明のウィジェットの端に色がにじむ問題が解消されました(公式ブログでは「bounded blur」と呼んでいます)。
デスクトップのマルチウィンドウ:3.41 安定版の制約
3.41 の公式ブログは、Canonical の主導でポップアップウィンドウとツールチップウィンドウの「実験的な API」を追加し、Linux・macOS・Windows でダイアログウィンドウに対応したと書いています。ただし、これを安定版のアプリで有効にすることはできません。
根拠はツール側の機能フラグです。タグ 3.41.0 の features.dart で、ウィンドウ機能 windowingFeature(設定名 enable-windowing)は master: FeatureChannelSetting(available: true) だけが定義され、beta と stable の設定がありません。つまり master チャンネルの SDK でしか有効にできません。公式ブログも試すなら multiple_windows のサンプルアプリを見るよう案内するにとどめています。
複数ウィンドウを前提にしたデスクトップアプリを 3.41 の安定版で作る計画は立てられません。いま必要なら、ネイティブ側で別ウィンドウを開く既存のプラグインを使うか、master チャンネルで検証にとどめるかのどちらかです。
デスクトップ関連でほかに 3.41 で直ったのは、Windows アプリがアイドル時に CPU を使い続ける問題(3.41.3)です。DevTools は dart2wasm でコンパイルされるようになり、設定画面から dart2js 版に戻せます。
3.41 に留まるか、3.44 以降へ上げるかの判断
Flutter の CHANGELOG には「we only hotfix the latest version」とあり、修正パッチは最新の安定版にしか出ません。3.44.0 が出た2026年5月18日以降、3.41 系には新しいパッチが出ておらず、3.41.9 が最後です。iOS 27 や Xcode 27 で見つかる問題は、3.41 では直りません。
そのうえで、3.41 に留まってよいのは次の条件がそろうときです。
- リリース直前で SDK を動かしたくなく、3.41.9 で既知の問題が出ていない。
- 依存パッケージが 3.44 以降を要求していない。たとえば
flutter_riverpod3.4.1 以降は Dart SDK の制約が^3.12.0で、Dart 3.12.0 を同梱する Flutter 3.44.0 以上でないと入りません。 - iOS のビルドに Xcode 26 系を使い続ける。
逆に、iOS 27 SDK でのビルドや新しい Xcode への追従が必要なら、3.41 に留まる理由はありません。3.44 では SwiftPM が既定になり、3.47 では Material と Cupertino を別パッケージで使えるようになり、Intel Mac でのビルドに警告が出るようになるため、差分が大きいほど一度に上げるコストが増えます。3.41 から上げる場合は、3.44 の変更を3.44 の記事で確認してから、3.47 の変更を3.47 の記事で確認する順に進めるのが安全です。
Flutter 3.41.9 への更新手順とバージョン固定
3.41 系のどれかを使っているなら、まず 3.41.9 にそろえます。flutter upgrade は安定版チャンネルの最新(2026年10月時点では 3.47 系)まで上げてしまうので、3.41.9 に固定したいときは SDK の git でタグを切り替えます。
flutter --version --machine # 出力の "flutterRoot" が SDK の実パス
cd /path/to/flutter # flutterRoot の値に置き換える
git fetch --tags
git checkout 3.41.9
flutter --version
flutter --version の出力に Flutter 3.41.9 と Dart 3.11.5 が出れば切り替わっています。その後、プロジェクトで次を順に実行します。
flutter pub get
dart fix --apply
flutter analyze
flutter test
dart fix --apply で containsSemantics などの非推奨 API は自動で置き換わります。可変フォントの太さと Material の配色は analyze では検出できないので、画面の見た目を確認してください。
チームや CI で版をそろえるなら、SDK 本体を切り替えるよりプロジェクト単位で固定するほうが事故が少なくなります。FVM なら fvm use 3.41.9 で固定できます。手順はFVMとは?Flutter SDKをプロジェクト単位で固定する運用とCI設定【2026年8月時点】で解説しています。
よくある質問
Flutter 3.41 の Dart バージョンは?
3.41.0〜3.41.2 は Dart 3.11.0、3.41.3 と 3.41.4 は 3.11.1、3.41.5 は 3.11.3、3.41.6 は 3.11.4、3.41.7〜3.41.9 は 3.11.5 です。
Flutter 3.41 のリリース日はいつですか?
3.41.0 は2026年2月11日(UTC)です。最終パッチの 3.41.9 は2026年4月30日に出ました。
Flutter 3.41 でマルチウィンドウは使えますか?
安定版では使えません。ウィンドウ機能のフラグ enable-windowing は master チャンネルでしか有効にできず、3.41 の API は実験的な扱いです。
Flutter 3.41 で AGP 9 に上げてもよいですか?
上げないでください。公式ブログが、プラグインを使うアプリの AGP 9 対応はまだサポートしていないと警告しています。テンプレートの既定は AGP 8.11.1 です。
Flutter 3.41 はいまも更新されますか?
更新されません。修正パッチは最新の安定版にしか出ないため、3.44.0 公開後の3.41 系は 3.41.9 が最後です。現行の安定版についてはFlutter 3.47 の記事を参照してください。