
【Flutter】「Execution failed for task ':app:checkDebugDuplicateClasses'.」発生時の対処法
概要
先日、「Macbook Air」2024年モデルを購入した記事を書いた。
これでAndroidエミュレーターも動かせるぞ〜、とウキウキしながらビルドするも、いきなりエラーが発生したので備忘録を記す。
●環境
Flutter 3.22.3
Android Studio Koala
エラー内容
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
> Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.22 (org.jetbrains.kotlin:kotlin-stdlib:1.8.22) and jetified-kotlin-stdlib-jdk8-1.7.10 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10)
……

こんな感じで、真っ赤っか。
まるで地獄のような光景である👹
解決策
Flutterプロジェクト内にはandroid、ios、linux、web、windows、macosと各プラットフォーム用のディレクトリが用意されている。

android/app/build.gradle を開き、以下を追記する
dependencies {
constraints {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
}
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
}
}
}
※ ここでの「android/app/build.gradle」とは、Flutter SDKを使用している方(VSCodeなど)のファイルです

再度、デバッグを走らせると

ビルドが通ったぜ👍

いい感じでリストが出る。
ちなみにアイテムはカード形式で表示している。
解説
パッケージの依存関係は2種類がある。
・直接的依存関係:依存関係として直接必要なもの
・推移的依存関係:別の依存関係として必要なもの
この内「推移的依存関係」だが、他の依存と複雑に絡み合い、いわゆる「競合」を起こしてしまう場合がある。
その為、「重複しているクラスがある」と言うエラーが発生する。
もちろん「重複クラス」エラーはAndroidネイティブ開発においても発生はする。
今回のケースでは、Androidネイティブ(Android Studioから直接)でのビルドでは発生しなかったので、Flutterとの絡みでの発生と思われる。
先のコードでは、constraints句で制約する事により、エラーを回避している訳です。
ちなみに、下記参考サイトの2つ目の方は「React Native」という単語も目にする。
「Flutter」だけでなく「React Native」と言う単語も含めると解決策の選択肢が増えるかも知れませんね💡
【参考】
著書
『 プログラマーにおくるFlutterアプリ開発の入門書』
2024年11月時点での最新技術をぎっしりと詰め込んであるので、アプリ開発に参画するエンジニアの人は、是非ともご覧になって頂ければと思います📱