【Flutter】Flutter 3.24.0にアップデートした際に発生したビルドエラーの解決方法

## はじめに
Flutter 3.24.0にアップデートした際に発生したビルドエラーの解決方法についてまとめます。

この記事は、私自身の環境で直面したエラーとその解決方法を記載しています。
依存関係やバージョンによって異なるエラーが発生する可能性があるため、その際にはエラーメッセージをもとに適切な対応方法をお探しいただければと思います。

また、ここで紹介する方法が最適解というわけではないかもしれないので参考程度にご覧いただけると幸いです。

## 前提
Flutter 3.16 ⇨ 3.19以降では`build.gradle`の記述方法が変更されており、その影響で発生するエラーや対応策について詳しくは、[こちらの記事](https://flutter.salon/error_warning/flutter-3-19-with-android/)や[公式](https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply)で解説されています。この変更点を理解しておくことで、ビルドエラーの解決がスムーズに進むかもしれません。

## 確認したエラー

### 1. Error: Type 'UnmodifiableUint8ListView' not found.

#### エラー文
```
Error (Xcode): ../../../.pub-cache/hosted/pub.dev/win32-5.5.0/lib/src/guid.dart:32:9:
Error: Type 'UnmodifiableUint8ListView' not found.
```
#### 原因
UnmodifiableUint8ListView クラスは、以前の Dart バージョンで利用されていましたが、Dart 3.5 で削除されました。このため、古いバージョンの win32 パッケージを使用している場合、このクラスが見つからないというエラーが発生します。

package_info_plusやdevice_info_plus等がWin32 APIに依存している？

https://github.com/halildurmus/win32/issues/887#issuecomment-2329109205

実際に pubspec.lock を確認すると、win32 のバージョンが `5.1.1` になっていました。

```pubspec.lock
packages:

  // 省略
  win32:
    dependency: transitive
    description:
      name: win32
      sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574
      url: "https://pub.dev"
    source: hosted
    version: "5.1.1"
```

pubspec.lockは現在のプロジェクトで使用されているすべての依存関係のバージョンが固定されています。詳しくは、以下の記事がわかりやすかったです。

https://minpro.net/pubspec-lock


#### 対応方法
##### 対応①: win32 のバージョンを上げる
issuesにある通り、`win32: ^5.5.1`以降にすればOK
win32 パッケージのバージョンを手動でアップグレードするには、以下のコマンドを実行します。

```
flutter pub upgrade win32
flutter clean
flutter pub get
```

##### 対応②: pubspec.lock を削除する
`pubspec.lock` を削除してから `flutter pub get` を実行して依存関係を再解決することで、不要なキャッシュが原因で発生している問題を回避できるため、この方法が簡単かもしれません

更新された`pubspec.lock`のwin32が5.5.1以降になっているか確認

```pubspec.lock
packages:

  // 省略
  
  win32:
    dependency: transitive
    description:
      name: win32
      sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a"
      url: "https://pub.dev"
    source: hosted
    version: "5.5.4"
```

https://github.com/jonataslaw/get_cli/issues/263#issuecomment-2359914616


### 2. Execution failed for task ':********:verifyReleaseResources'.
#### エラー文
```
* What went wrong:
Execution failed for task ':flutter_app_badger:verifyReleaseResources'.
> A failure occurred while executing com.android.build.gradle.tasks.VerifyLibraryResourcesTask$Action
   > Android resource linking failed
     ERROR:/Users/user/****/build/flutter_app_badger/intermediates/merged_res/release/values/values.xml:194: AAPT: error: resource android:attr/lStar not found.
```

#### 原因
このエラーは Android リリースビルド時に発生します。`flutter_app_badger`で発生することもありますが、他のパッケージでも同様のエラーが報告されています。

依存関係のバージョンの不整合が起きている？
実際の原因はあまりよくわかっていないです。。有識者の方がいましたらご教授いただけますと幸いです。。


#### 対応方法
`android/build.gradle`のsubprojectsを以下の様に修正する。
```diff_gradle
subprojects {
+   afterEvaluate {
+       android {
+           compileSdkVersion 34
+       }
+   }
}
subprojects {
+   project.buildDir = "${rootProject.buildDir}/${project.name}"
    project.evaluationDependsOn(':app')
}
```

https://github.com/flutter/flutter/issues/153281#issuecomment-2287902896

### 3. Dependency ':flutter_local_notifications' requires core library desugaring to be enabled
#### エラー文
このエラーは Android リリースビルド時に発生します。
`flutter_local_notifications`で発生したエラーです。

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:checkReleaseAarMetadata'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction
   > An issues were found when checking AAR metadata:

       1.  Dependency ':flutter_local_notifications' requires core library desugaring to be enabled
           for :app.

           See https://developer.android.com/studio/write/java8-support.html for more
           details.
```
#### 原因
このエラーはFlutter 3.24.0自体には関係しておらず、flutter_local_notificationsの特定のバージョンによるものです。

バージョン10以降では、Androidの古いバージョンとの下位互換性を保ちながら通知機能をサポートするには、`densugaring`を有効にする必要があるとのこと。

https://pub.dev/packages/flutter_local_notifications#gradle-setup

#### 対応方法
compileOptionsと、desugaringコアライブラリへの依存関係を追加する必要があります。
`android/app/build.gradle`に以下追加
```diff_gradle
android {
    // 省略

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
+       coreLibraryDesugaringEnabled true
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }
    
    // 省略

}

    // 省略
dependencies {
    implementation ***********
    implementation ***********
+   coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
}
```

https://github.com/MaikuB/flutter_local_notifications/issues/2286#issuecomment-2030829564

coreLibraryDesugaringは、使用しているAGP（Android Gradle Plugin）のバージョンによって適宜設定してください。

https://developer.android.com/studio/write/java8-support?hl#library-desugaring

### 4.compileReleaseJavaWithJavac' (1.8) and 'compileReleaseKotlin' (17).
#### エラー文
このエラーは Android リリースビルド時に発生しました。
```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':qr_code_scanner:compileReleaseKotlin'.
> Inconsistent JVM-target compatibility detected for tasks 'compileReleaseJavaWithJavac' (1.8) and 'compileReleaseKotlin' (17).

  Consider using JVM Toolchain: https://kotl.in/gradle/jvm/toolchain
  Learn more about JVM-target validation: https://kotl.in/gradle/jvm/target-validation
```

#### 原因
このエラーは Android リリースビルド時に発生します。
JVMのターゲットバージョンがJavaとKotlinで異なっているために発生している可能性が高い？？

#### 対応方法
この設定はエラーメッセージを無視してビルドを強制的に進めるため、根本的な解決にはならない可能性があります。

`android/gradle.properties`に以下追加
```diff_properties
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
+ kotlin.jvm.target.validation.mode = IGNORE
```

https://stackoverflow.com/questions/78110941/compilereleasejavawithjavac-error-when-trying-to-output-application-in-aab-fo

https://stackoverflow.com/questions/69079963/how-to-set-compilejava-task-11-and-compilekotlin-task-1-8-jvm-target-com#:~:text=%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,kotlin.jvm.target.validation.mode%20%3D%20IGNORE,-%E4%B8%8A%E8%A8%98%E3%81%AE%E4%BD%BF%E7%94%A8



### 5. Namespace not specified.
#### エラー文
このエラーは Android リリースビルド時に発生しました。
```
* What went wrong:
A problem occurred configuring project ':flutter_app_badger'.
> Could not create an instance of type com.android.build.api.variant.impl.LibraryVariantBuilderImpl.
   > Namespace not specified. Specify a namespace in the module's build file. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about setting the namespace.

     If you've specified the package attribute in the source AndroidManifest.xml, you can use the AGP Upgrade Assistant to migrate to the namespace value in the build file. Refer to https://d.android.com/r/tools/upgrade-assistant/agp-upgrade-assistant for general information about using the AGP Upgrade Assistant.
```
#### 原因
Gradle8.ｘになって「namespace」の記載場所がいくつかのFlutterのライブラリがそれを認識してくれない？？


#### 対応方法
`android/build.gradle`に以下追加
```diff_gradle
allprojects {
    repositories {
        google()
        mavenCentral()
    }
+    subprojects {
+       afterEvaluate { project ->
+           if (project.hasProperty('android')) {
+               project.android {
+                   if (namespace == null) {
+                       namespace project.group
+                   }
+               }
+           }
+       }
+   }
}

```

https://minpro.net/namespace-not-specified

### 6. Error: 'CarouselController' is imported from both
#### エラー文
```
Error (Xcode): ../../../.pub-cache/hosted/pub.dev/carousel_slider-4.2.1/lib/carousel_slider.dart:9:1: Error: 'CarouselController' is imported from both
'package:carousel_slider/carousel_controller.dart' and 'package:flutter/src/material/carousel.dart'.
```
#### 原因
`carousel_slider: ^4.2.1`を使用していたためエラー発生。

https://pub.dev/packages/carousel_slider

`package:carousel_slider/carousel_controller.dart`と
`package:flutter/src/material/carousel.dart`の両方から`CarouselController`がインポートされているみたい。

#### 対応方法
① `carousel_slider: ^5.0.0`にバージョンを上げる
② 上記に伴い、`CarouselController`を使用していれば`CarouselSliderController`へ変更する。

https://github.com/serenader2014/flutter_carousel_slider/issues/454#issuecomment-2276968985