升级库后出现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
相关产品推荐
相关产品推荐

