Flutterでコアライブラリの脱糖化を有効化
flutter_local_notifications
を使用する際、次のエラーが発生することがあります:
Dependency ':flutter_local_notifications' requires core library desugaring to be enabled for :app
このエラーはパッケージがJava 8+の機能に依存しているため、デスガリング(脱糖化)を有効にする必要があることを示しています。
解決手順
ステップ 1: app/build.gradle
の変更
android
ブロック内のcompileOptions
を更新します:
groovy
android {
compileOptions {
// コアライブラリの脱糖化を有効化
coreLibraryDesugaringEnabled true
// Javaバージョンの設定(1.8以上)
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Javaバージョンについて
- Java 11を使用する場合は
VERSION_11
に変更可能 kotlinOptions
がある場合は合わせて更新:groovykotlinOptions { jvmTarget = '1.8' // または '11' }
ステップ 2: 依存関係の追加
app/build.gradle
のdependencies
ブロックに脱糖化ライブラリを追加:
groovy
dependencies {
// デスガリングライブラリ(最新安定版を使用)
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
}
バージョンの互換性
AGP(Android Gradle Plugin)のバージョンごとに互換性のあるバージョン:
- AGP 7.4+ →
2.0.3
- AGP 7.3 →
1.2.3
- AGP 4.0-7.2 →
1.1.9
Kotlin DSL(build.gradle.kts)の場合
kotlin
android {
compileOptions {
isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
}
適用後の最終構成例
app/build.gradle
の完全なサンプル:
groovy
android {
namespace "com.example.app"
compileSdkVersion 34
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
defaultConfig {
applicationId "com.example.app"
minSdkVersion 21
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
}
なぜこの設定が必要か
flutter_local_notifications
は以下のJava 8+機能を使用します:
- 新しい日時API(
java.time
パッケージ) - ストリームAPI(
java.util.stream
) - 関数型インターフェース
デスガリングの仕組み
脱糖化はビルド時にJava 8+のコードをAndroidがサポートするJava 7形式へ変換するプロセスです。
トラブルシューティング
同期エラーが続く場合:
bashflutter clean rm -rf android/.gradle flutter pub get
マルチデックスエラーの場合:
groovydefaultConfig { multiDexEnabled true }
古いバージョンで発生する問題:
- Flutter 3.10+を使用
- Android Gradle Pluginを8.3+に更新
- Gradle自体を8.4+に更新(
gradle-wrapper.properties
で設定)
参考資料
- 公式ドキュメント: Java 8+ APIの脱糖化サポート
flutter_local_notifications
公式パッケージ