Kotlin MVVM架构下用ViewModel Factory无法创建AuthViewModel实例如何解决
问题修复方案
直接报错原因与修复
你出现java.lang.RuntimeException: Cannot create an instance of class com.example.paperseller.ui.menu.ViewModels.AuthViewModel报错,核心是两个代码错误:
- ViewModel初始化未传入自定义Factory
你代码中虽然实例化了Factory,但调用by viewModels()时没有将Factory作为参数传入,系统会默认用无参构造创建AuthViewModel,而你的AuthViewModel是带Repository参数的,自然实例化失败。
同时注意你代码里的viewmodels全小写是拼写错误,正确的KTX扩展函数为首字母大写的viewModels。
修复后初始化代码:
private fun initializeUI() { val factory = InjectorUtils.providePaperSellerViewModelFactory() val viewModel : AuthViewModel by viewModels { factory } viewModel.message.observe(this) { message -> Toast.makeText(requireActivity(), message, Toast.LENGTH_LONG).show() } binding.registerButton.setOnClickListener { val user = User(binding.emailText.text.toString(), binding.passwordText.text.toString()) viewModel.register(user) } }
- ViewModelFactory实现不规范
你当前继承的ViewModelProvider.NewInstanceFactory仅支持调用ViewModel的无参构造,自定义带参数的Factory应该直接实现ViewModelProvider.Factory接口,同时需要对传入的ViewModel类型做校验,避免后续扩展时报错。
修复后Factory代码:
package com.example.paperseller.ui.menu.ViewModelFactory import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.example.paperseller.Data.PaperSellerRepository import com.example.paperseller.ui.menu.ViewModels.AuthViewModel class PaperSellerViewModelFactory(private val paperSellerRepository: PaperSellerRepository) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun <T: ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(AuthViewModel::class.java)) { return AuthViewModel(paperSellerRepository) as T } throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") } }
补充校验点
确认你的AuthViewModel构造方法为公开,参数匹配:
class AuthViewModel(private val repository: PaperSellerRepository) : ViewModel() { // 你的业务逻辑实现 }
ViewModel Factory的必要性说明
- 如果你的ViewModel没有任何构造参数,不需要自定义Factory,直接使用
by viewModels()即可完成实例化 - 如果你的ViewModel需要传入Repository、全局配置等依赖参数,必须通过自定义Factory传递参数,否则系统无法识别带参构造,就会抛出你遇到的实例化失败错误
内容的提问来源于stack exchange,提问作者jens.svensson
相关产品推荐
相关产品推荐

