Skip to content

Flutter 3.44.8対応: iOS SPM化 / Android built-in Kotlin化 / パッケージ更新 - #67

Merged
hukusuke1007 merged 12 commits into
mainfrom
feature/3.44.7
Aug 2, 2026
Merged

hukusuke1007 merged 12 commits into
mainfrom
feature/3.44.7

Conversation

@hukusuke1007

Copy link
Copy Markdown
Owner

概要

layer_first / feature_first の両テンプレートを Flutter 3.44.8 で動作するように更新しました。あわせて iOS を Swift Package Manager 化、Android を built-in Kotlin 化し、パッケージを最新版へ更新しています。

Flutter / Dart

  • Flutter 3.44.8(.fvmrc / .tool-versions / .metadata)
  • Dart SDK ^3.12.2

iOS: Swift Package Manager 化

両プロジェクトとも CocoaPods を完全に撤去しました(Podfile / Podfile.lock / Pods を削除、xcconfig と workspace から Pods 参照を除去)。全プラグインが Swift Package に対応済みであることを確認しています。

feature_first は Podfile に独自処理があったため、以下を移行しました。

  • permission_handler のマクロ設定: Podfile の post_install で GCC_PREPROCESSOR_DEFINITIONS を設定していましたが、permission_handler_apple 9.5 の Package.swift が Info.plist のキーから自動判定するようになったため不要になりました。既存の NSCameraUsageDescription / NSPhotoLibrary*UsageDescription により Camera・Photos・Notifications が有効化され、旧設定と一致します。
  • Crashlytics の dSYM アップロード: ${PODS_ROOT}/FirebaseCrashlytics/run は CocoaPods 撤去で解決できなくなるため、SPM 用パス ${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run に変更。
  • Firestore プリビルドフレームワーク(invertase)は廃止。Firebase の SPM 配布が abseil-cpp-binary / grpc-binary などプリビルドを利用するため代替されます。

iOS: UIScene ライフサイクル移行

layer_first は Flutter の自動移行が適用されました。feature_first は AppDelegate にカスタム処理があり自動移行の対象外だったため、手動で移行しています。

  • AppDelegate を FlutterImplicitEngineDelegate に準拠させ、登録処理を didInitializeImplicitFlutterEngine へ移動
  • 移行後は didFinishLaunchingWithOptions の時点で window.rootViewController が未設定になるため、ScreenReaderPlugin へは engineBridge.applicationRegistrar.messenger() を渡すよう変更(configure の引数を FlutterViewController → FlutterBinaryMessenger に変更)
  • Info.plist に UIApplicationSceneManifest を追加

Android: Gradle / built-in Kotlin

layer_first feature_first
Gradle 9.1.0 9.3.1
AGP 9.0.1 9.1.1
Kotlin 2.3.20 2.3.20
Java 17 17
compileSdk flutter.compileSdkVersion (36) 37

built-in Kotlin 化(両プロジェクト共通)

  • app/build.gradle.kts から id("kotlin-android") を削除(Flutter Gradle Plugin が自動適用)
  • android { kotlinOptions { } } → トップレベルの kotlin { compilerOptions { jvmTarget = JVM_17 } }
  • gradle.properties に android.newDsl=false / android.builtInKotlin=false を追加、android.enableJetifier=true を削除
  • settings.gradle.kts の KGP 宣言は apply false のまま維持(Flutter Gradle Plugin が classpath から解決するため必要)
  • ndkVersion のハードコードをやめ flutter.ndkVersion に戻しました

feature_first のみ

  • AGP 9 の破壊的変更対応: getDefaultProguardFile("proguard-android.txt") → proguard-android-optimize.txt、buildFeatures { resValues = true } を追加(AGP 9 から resValues がデフォルト無効)
  • google-services 4.3.15 → 4.5.0、firebase-crashlytics-gradle 2.8.1 → 3.0.7、desugar_jdk_libs 2.1.4 → 2.1.5

note
feature_first だけ Gradle/AGP が新しいのは、permission_handler 13.0.0 の Android 実装が compileSdk 37 を要求する一方、Flutter 3.44 テンプレートの AGP 9.0.1 が API 37 のマイナーバージョン形式(android-37.0)を解決できないためです。パッケージ最新を優先する方針で AGP を上げています。

静的解析

riverpod_lint 3.1 系が custom_lint から Dart ネイティブの analysis_server_plugin に移行したため、設定方法を変更しました。

  • custom_lint を依存から削除
  • analysis_options.yaml の analyzer: plugins: → トップレベルの plugins: riverpod_lint: へ
  • feature_first は analyzer.exclude に build/** を追加(SPM 有効時に build/ios/SourcePackages へ依存パッケージのソースが展開され、解析対象に入って 2000 件超の誤検知が出るため)

パッケージ更新に伴う破壊的変更の対応

  • map_launcher 6.0.0: MapType enum → MapApp オブジェクト、MapLauncher.showMarker() → MapLauncher.marker(...).show()、アイコンが SVG → PNG バイト列(SvgPicture.asset → Image.memory)
  • flutter_local_notifications 22.x: initialize / show / zonedSchedule / periodicallyShow / cancel が全て名前付き引数に変更
  • flutter_timezone 5.x: getLocalTimezone() の戻り値が TimezoneInfo になったため .identifier を使用
  • SnackBar: SnackBar.persist が追加され、既定値が persist ?? action != null になりました。showSnackBar は常に action を渡していたため persist が暗黙的に true となり、duration が無視されて自動で閉じなくなっていました。persist: false を明示して従来の挙動に戻しています
  • 新 lint 対応(simple_directive_paths / directives_ordering / unnecessary_async)

検証

analyze test Android debug Android release iOS build
layer_first ✅ ✅ 9件 ✅ APK ✅ AAB ✅
feature_first ✅ ✅ 19件 ✅ APK ✅ AAB ✅

UIScene 移行後の iOS ビルドで、UIScene 警告および rootViewController の deprecation 警告が解消していることを確認済みです。

レビュー時の確認事項

  • シミュレータ・実機での動作確認は未実施です。特に UIScene 移行はアプリの起動経路が変わるため、起動確認と VoiceOver 連携(com.example.app/method/screenReader)の確認をお願いします。
  • CI の Flutter バージョンが 3.44.7 のままです(プロジェクトは 3.44.8)。揃えるかご判断ください。
  • flutter_svg が未使用になりました(map_launcher 6.0.0 でアイコンが PNG 化されたため)。import は削除済みですが、テンプレートとして残すかは判断が必要なため pubspec には残しています。
  • AppMapType enum(show_map_launcher.dart)は以前から未使用のデッドコードです。今回の変更対象外のため触っていません。

🤖 Generated with Claude Code

@hukusuke1007
hukusuke1007 merged commit bacfc19 into main Aug 2, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant