升级androidx.lifecycle至2.5.0后ViewModelFactory编译报错求助
解决lifecycle:2.5.0升级后ViewModelFactory编译错误的方案
错误原因
androidx.lifecycle:lifecycle库升级到2.5.0后,ViewModelProvider.Factory接口新增了带@JvmDefault注解的默认方法,而Kotlin编译器默认不支持继承包含这类方法的接口,因此会抛出编译错误:Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option。
解决方法
方法一:开启Kotlin编译参数
在模块级的build.gradle(或build.gradle.kts)中添加-Xjvm-default编译参数,支持继承带默认方法的接口:
Groovy DSL(build.gradle)
android { // 保留原有配置 kotlinOptions { jvmTarget = "1.8" // 添加以下参数,二选一即可 // all:启用全量默认方法支持,推荐纯Kotlin项目使用 freeCompilerArgs += ["-Xjvm-default=all"] // compatibility:兼容旧模式,适合混编项目 // freeCompilerArgs += ["-Xjvm-default=compatibility"] } }
Kotlin DSL(build.gradle.kts)
android { // 保留原有配置 kotlinOptions { jvmTarget = "1.8" // 添加以下参数,二选一即可 freeCompilerArgs += "-Xjvm-default=all" // freeCompilerArgs += "-Xjvm-default=compatibility" } }
添加后执行Clean Project再Rebuild Project即可。
方法二:改用官方推荐的Factory实现方式
如果不想修改编译参数,可以使用lifecycle-viewmodel-ktx提供的简化API创建Factory,避免直接继承ViewModelProvider.Factory接口:
首先确保已添加lifecycle-viewmodel-ktx依赖(2.5.0版本):
// Groovy implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0"
// Kotlin DSL implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0")
然后用viewModelFactory扩展函数创建Factory:
import androidx.lifecycle.viewmodel.viewModelFactory val bookingViewModelFactory = viewModelFactory { initializer { BookingViewModel(api, localStorage) } }
或者在创建ViewModel时直接内联实现:
val viewModel = ViewModelProvider(this, object : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return BookingViewModel(api, localStorage) as T } })[BookingViewModel::class.java]
注意事项
- 如果之前尝试新方式仍报错,检查是否遗漏了ktx依赖,或执行
Invalidate Caches / Restart清除缓存后重试。 - 若项目包含Java代码实现
ViewModelProvider.Factory,Java 8及以上版本默认支持接口默认方法,无需额外配置,但Kotlin代码仍需开启上述编译参数。
内容的提问来源于stack exchange,提问作者Eugene Troyanskii
相关产品推荐
相关产品推荐

