You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级库后出现IllegalStateException: VIEW_MODEL_KEY缺失问题求解决

解决VIEW_MODEL_KEY必须由ViewModelProvider提供的异常

问题背景

近期执行以下操作后,出现java.lang.IllegalStateException: VIEW_MODEL_KEY must always be provided by ViewModelProvider异常:

  • 升级Gradle版本至8.4.1
  • 升级ViewModel库至2.8.0
  • 将依赖处理从kapt替换为ksp

项目使用Koin进行依赖注入,相关Activity代码如下:

class LoginRegisterActivity : AppCompatActivity() {

    private lateinit var binding: FragmentLoginRegisterBinding
    private val viewModel: LoginRegisterViewModel by viewModel {
        parametersOf(
            AuthClient(),
            FireStoreClient()
        )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = FragmentLoginRegisterBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setLoginFunction()
        setRegisterUserFunction()
        setForgotPasswordFunction()
    }

    override fun onStart() {
        super.onStart()
        if (AuthClient.auth.currentUser != null) {
            reload()
        }
    }
}

完整错误日志:

Caused by: java.lang.IllegalStateException: VIEW_MODEL_KEY must always be provided by ViewModelProvider
     at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.kt:83)
     at androidx.lifecycle.ViewModelProvider$Factory.create(ViewModelProvider.android.kt:158)
     at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release(ViewModelProviderImpl.kt:69)
     at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release$default(ViewModelProviderImpl.kt:47)
     at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.android.kt:91)
     at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.android.kt:109)
     at org.koin.androidx.viewmodel.ViewModelResolverKt.resolveInstance(ViewModelResolver.kt:15)
     at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:67)
     at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:53)
     at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel$default(ScopeExt.kt:45)
     at org.koin.androidx.viewmodel.ext.android.ComponentCallbackExtKt.getViewModel(ComponentCallbackExt.kt:63)
     at xxxx.xxxx.xxxx.xxxx.views.login_register.LoginRegisterActivity$special$$inlined$viewModel$default$2.invoke(ComponentCallbackExt.kt:65)
     at xxxx.xxxx.xxxx.xxxx.views.login_register.LoginRegisterActivity$special$$inlined$viewModel$default$2.invoke(ComponentCallbackExt.kt:42)
     at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
     at xxxx.xxxx.xxxx.xxxx.views.login_register.LoginRegisterActivity.getViewModel(LoginRegisterActivity.kt:23)
     at xxxx.xxxx.xxxx.xxxx.views.login_register.LoginRegisterActivity.setLoginFunction(LoginRegisterActivity.kt:48)
     at xxxx.xxxx.xxxx.xxxx.views.login_register.LoginRegisterActivity.onCreate(LoginRegisterActivity.kt:35)
     at android.app.Activity.performCreate(Activity.java:8975)
     at android.app.Activity.performCreate(Activity.java:8944)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4146)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322) 
     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) 
     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685) 
     at android.os.Handler.dispatchMessage(Handler.java:106) 
     at android.os.Looper.loopOnce(Looper.java:230) 
     at android.os.Looper.loop(Looper.java:319) 
     at android.app.ActivityThread.main(ActivityThread.java:8919) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) 

解决方案

这个异常是ViewModel 2.8.0版本与旧版Koin不兼容导致的——ViewModel 2.8.0强制要求通过ViewModelProvider传递VIEW_MODEL_KEY,而旧版Koin未适配该变化。

步骤1:升级Koin到兼容版本

确保Koin的androidx-viewmodel依赖版本至少为3.5.3(或更高稳定版),在项目的Module级别build.gradle中更新依赖:

// 核心Koin依赖
implementation "io.insert-koin:koin-core:3.5.3"
// Android ViewModel相关依赖
implementation "io.insert-koin:koin-androidx-viewmodel:3.5.3"
// 若使用其他Koin扩展(如workmanager),需同步升级对应版本

步骤2:优化ViewModel注入方式

避免在by viewModel中手动实例化依赖(如AuthClient()、FireStoreClient()),建议通过Koin模块统一管理依赖:

// 定义Koin模块
val appModule = module {
    single { AuthClient() }
    single { FireStoreClient() }
    viewModel { LoginRegisterViewModel(get(), get()) }
}

// Activity中直接获取ViewModel,无需手动传参
private val viewModel: LoginRegisterViewModel by viewModel()

步骤3:清理缓存并重构项目

执行Clean Project和Rebuild Project操作,确保依赖更新生效,避免缓存引发的问题。

若升级Koin后问题仍存在,可暂时回退ViewModel版本至2.7.0验证是否为版本兼容问题,但更推荐升级Koin到适配版本,因为ViewModel的新特性为长期支持项。

内容的提问来源于stack exchange,提问作者groff07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:24:53