带@Inject构造的ViewModel实例化时报Cannot create an instance of class错误如何解决
报错原因
默认的ViewModelProvider.Factory仅支持实例化无参构造的ViewModel。你当前的MyViewModel构造方法携带了Application参数,仅添加@Inject注解但未配套依赖注入框架的ViewModel实例化工厂,系统无法匹配到合法的构造方法完成实例化,因此抛出「Cannot create an instance of class」错误。
解决方案
可根据你的项目技术栈选择以下任意一种方案:
- 方案1:继承官方
AndroidViewModel(无依赖注入场景,最简实现)AndroidViewModel是ViewModel的官方子类,默认持有Application实例,无需额外配置实例化工厂,代码修改如下:
class MyViewModel(application: Application) : AndroidViewModel(application) { // 直接通过getApplication()获取Application实例,调用packageName即可 fun getCurrentPackageName() = getApplication<Application>().packageName }
Activity中的初始化代码无需修改。
- 方案2:使用Hilt依赖注入(项目已接入Hilt场景)
新增Hilt相关注解即可,无需自定义工厂:
ViewModel代码修改:
@HiltViewModel class MyViewModel @Inject constructor(val application: Application) : ViewModel() { // 直接使用application实例 }
Activity代码修改:
@AndroidEntryPoint class Activity: BaseActivity(){ val viewModel: MyViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } }
注意需要确保你的项目已完成Hilt的基础配置(Application类添加@HiltAndroidApp注解)。
- 方案3:自定义ViewModel工厂(无依赖注入、不想继承AndroidViewModel场景)
自定义工厂类手动传递Application参数:
首先定义工厂类:
class MyViewModelFactory(private val application: Application) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MyViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MyViewModel(application) as T } throw IllegalArgumentException("Unknown ViewModel class") } }
Activity中初始化时传入自定义工厂:
class Activity: BaseActivity(){ val viewModel: MyViewModel by viewModels { MyViewModelFactory(application) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } }
内容的提问来源于stack exchange,提问作者RaceyT
相关产品推荐
相关产品推荐

