问题:在模块中发现重复类androidx.lifecycle.viewmodel

181

当我尝试运行模拟器时,出现了以下错误:

在jetified-lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)和lifecycle-viewmodel-2.4.0-runtime(androidx.lifecycle:lifecycle-viewmodel:2.4.0)模块中都发现了重复的类androidx.lifecycle.ViewModelLazy。

在jetified-lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)和lifecycle-viewmodel-2.4.0-runtime(androidx.lifecycle:lifecycle-viewmodel:2.4.0)模块中都发现了重复的类androidx.lifecycle.ViewModelProviderKt。

在jetified-lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)和lifecycle-viewmodel-2.4.0-runtime(androidx.lifecycle:lifecycle-viewmodel:2.4.0)模块中都发现了重复的类androidx.lifecycle.ViewTreeViewModelKt。

注意:这不是与Android模拟器相关的问题,而是gradle构建的问题。


1
也许这个解决方案对你有用 stackoverflow上的答案 - Vishal Beep
6
我也在使用Gradle构建时遇到了这个问题。这并不是特定于Android模拟器的。 - BlankSpace
是的,在所有构建中都是这样!你说得对!请看我的回答 ;) - Zhar
16个回答

215

很可能,你的某个依赖项使用了kotlin版本的viewmodel库,而你的代码使用的是java版本。

同时指定两者以确保所有依赖项都使用最新版本:

def lifecycle_version = "2.4.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"

5
谢谢,我之前没有使用viewmodel-ktx,但看起来viewmodel-savedstate需要它。所以在添加viewmodel-ktx:$lifecycle_version之后,问题得到了解决。 - BlankSpace
4
好的,这个答案将被标记为正确答案。我也有一个使用lifecycle-viewmodel 2.4.0和lifecycle-livedata 2.4.0的Java模块,并且jetifier生成了2.3.1并导致冲突。即使在添加了lifecycle-viewmodel-ktx:2.4.0依赖项后,我在Java模块中没有使用ktx,我的错误也得以解决。 - Yingding Wang
2
我应该把这个放在我的项目哪里?Build.gradle文件中吗? - Jackie
3
@Jackie 是的,在应用程序的 build.gradle 文件中的 dependencies 部分。 - l33t
4
很棒。对于使用最新的 Kotlin(1.7.21,2022年11月)的人,请注意您的 lifecycle_version 应为 2.5.1。除此之外,这个解决方案仍然有效。 - TDuff
不错的修复,我相信对我来说错误的源头是当我将代码复制到我的项目中并使用alt+enter导入依赖项时,我想我点击了错误的选项。所以提醒大家要小心导入正确的依赖项。 - Seth Harlaar

144

我曾经遇到同样的问题,只需添加一行代码即可解决。

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'

1
谢谢。今天这个方法可行了。我不知道哪个库使用了类。我添加了以下内容来解决问题:implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0'。 - Hong
5
我不明白为什么人们会点赞这个抄袭的回答。首先,这个解决方案是错误的,并且在第三方库更新后会失效。你应该同时指定kotlin和java的版本。这样,你就可以控制使用哪个lifecycle-viewmodel库的版本。 - l33t
1
这对我有用,所以我不关心它是否是一个模仿的答案,我已经投票支持了它。在尝试了许多依赖解析策略后,为我节省了数小时的时间。 - Rafsanjani
它对我起作用了。但是,我仍然无法确定这个答案是否是正确的解决方案。 - Rumit Patel
添加实现 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' 对我有效。 - Giancarlo Molina

46
问题:当我将appcompat依赖更新到1.5.1时,出现了这个错误。

解决方案:我将appcompat依赖更新到1.6.1
*较新的版本也应该可以正常工作。

// Pick one:
// Kotlin
implementation("androidx.appcompat:appcompat:1.6.1")
// Groovy
implementation "androidx.appcompat:appcompat:1.6.1" 

原因:这个工作是因为在1.6.0-beta01 中实现了一个错误修复。

1.6.0-beta01 发布说明 在“Bug修复”部分中表示:

AppCompat现在明确依赖于Lifecycle 2.5.1SavedState 1.2.0。(I7e3e2


1
这是我个人认为最好的解决方案,因为它优雅地修复了潜在的问题。唯一的缺点是它使用的是一个发布候选版本而不是稳定版本,但是一旦稳定版本>=1.6.0发布,这将不再是一个问题。 - Mauro Vanetti
1
这个解决方案对我很有效。非常简单。我也使用了1.5.1版本并遇到了错误。 - MD. Shafiul Alam Biplob
1
谢谢,这解决了问题。现在有一个更新的 alpha 版本 androidx.appcompat:appcompat:1.7.0-alpha01,它也解决了这个问题。 - Darksymphony
1
谢谢,这对我来说更好了,现在我只需要更新到最新的稳定版本1.6.1,错误就消失了。 - Bruce
谢谢@Bruce,我会用最新版本更新答案。 - Just The Highlights
1
真是个麻烦!最近在更新材料依赖时遇到了这个问题,没有更新androidx.appcompat依赖。谢谢! - Siele Kim

27

将viewmodel和viewmodel-ktx版本更改为它们的最新版本对我解决了问题:

implementation "androidx.lifecycle:lifecycle-viewmodel:2.5.1"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"

10
只添加第二行对我有用。 - mspnr
2
在我的情况下,Gradle 中的某个其他实现库正在使用版本 2.3.1,并且编写这两行代码解决了问题。谢谢。 - Diljeet
你不需要为 Kotlin 项目使用第一个。 - user924
首先添加了这两行代码,这在我的情况下有所帮助。然后我尝试只使用第二行代码,也能够正常工作。第二行代码似乎已经足够了。无论如何:非常感谢。 - cluster1

27

我认为消除重复的类比添加新的类更好,所以我会在这里发布解决此问题的解决方案:

configurations {
    all {
        exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx'
    }
}

这些代码需要添加到项目级别的build.gradle文件中-并且构建错误将随之消失,浪费内存也会减少一点,但仍需注意。

在将Kotlin库添加到项目后出现了奇怪而难以理解的行为,后来决定用Java版本替换它。如果你进入.gradle文件夹,可以在那里找到它,但我不确定从那里删除它是否是个好主意,因为它可能被其他的库使用。奇怪的是gradle或AndroidStudio没有自动解决这个问题,因为在build.gradle文件中只指定了Java的依赖项。


你所指的“内存”是指PC还是Android设备?据我所见,生成的APK没有额外的臃肿(可能是由于R8的结果)。 - l33t
我在谈论生成的apk。 - Alex Rmcf
@l33t 精确 - 12,870,436 字节 vs 13,102,070 字节。正如我之前所说的 - 差距不大,但仍然存在。 - Alex Rmcf
我运行了一些测试。使用所有的优化(例如,Release + 使用 R8 进行缩小),移除 lifecycle-viewmodel-ktx 可以将大小减小 不到 1kB。很可能 R8 能够消除 99% 的膨胀,仅剩下一个或两个额外的类(classes.dex 不同)。您的解决方案似乎有效,但为什么缩小器不能消除那些最后的类呢?可能是 R8 中的一些小问题,也可能是一个真正需要这些 kotlin 类的第三方依赖项。您的数字表明还有其他问题。 - l33t
@l33t 我之前的解释不太准确。为了得到提到的数字,我排除了一些明确使用但也作为其他库依赖项存在的库(但例如版本较低)。 排除组:'org.json',模块:'json' 排除组:'androidx.lifecycle',模块:'lifecycle-viewmodel-ktx' 排除组:'androidx.lifecycle',模块:'lifecycle-viewmodel:2.3.1' 排除组:'org.apache.commons',模块:'commons-lang3' 和其他库。 - Alex Rmcf
没有帮助!!! - C.F.G

13

对于使用compose的任何人来说,你只需要添加以下内容:

implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1"

9

这篇帖子提到,我将appcompat从1.5.0回退到1.4.2,解决了这个线程中建议的问题:重复的类androidx.lifecycle.ViewModelLazy在modules lifecycle-viewmodel-2.5.0-runtime中被找到。


我并没有明确地使用这些库,而这是唯一帮助我的解决方案。configurations.all.exclude 对我无效。谢谢! - KaHa6uc
2
或者将appcompat升级到1.6.0-rc1(或更高版本),在1.5.1中对我来说并没有修复,尽管发布说明如此说明。 - hb0

7

按照l33t的指示,我添加了

def lifecycle_version = "2.5.1"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"

但是将这些代码行放在了错误的文件中,出现了以下错误:

无法找到参数 implementation() 的方法...

解决方案:确保您将这些依赖项添加到 android/app/build.gradle 文件中,而不是 android/build.gradle 文件中。 请参见此处。


这在2023年5月15日解决了我的问题,当我试图在我的Flutter应用中使用Web3Auth Plug n Play SDK时。 - Wilfred Almeida

7

我遇到了同样的错误,但没有找到解决方法。关键的一点是在这里解决错误(我的项目中使用的preferences 1.2.0->添加排除分组)。

  def preference_version = "1.2.0"
    implementation ("androidx.preference:preference:$preference_version"){
        exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel'
        exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
    }

那么使用2.5.1版本来管理生命周期依赖。

def lifecycle_version = "2.5.1"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"

// https://developer.android.com/jetpack/androidx/releases/lifecycle
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

这个运行良好,我希望它能帮助一些人!


对我来说,这是正确的答案,但它仍然让我担忧。不过,这并不像Kotlin依赖被拉入Java库那么让人担心。 :P - Dustin

7
虽然这些答案都可以工作,但是有一种更好的方法来设置传递依赖版本,而不是将包含在直接依赖项中。
constraints {
   implementation('androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1') {
      because 'insert explanation here'
   }
}

以下是 https://docs.gradle.org/current/userguide/dependency_constraints.html 的详细介绍:


非常干净的解决方案。 - Mauro Vanetti
没有其他解决方案起作用,谢谢! - Pythogen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接