如何通过ViewModelProvider Factory向ViewModel传递Application上下文
解决方案
你当前的报错原因是修改后的SettingsViewModel构造要求传入Application实例,但原来的Factory类创建实例时没有传递该参数,按以下两步修改即可:
- 调整
SettingsViewModelProviderFactory,增加Application构造参数,创建ViewModel时传入该实例
class SettingsViewModelProviderFactory(val application: Application) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(SettingsViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return SettingsViewModel(application) as T } throw IllegalArgumentException("未知的ViewModel类型") } }
- 修改
LoginActivity中Factory的实例化代码,传入当前应用的Application实例
val viewModelProviderFactory = SettingsViewModelProviderFactory(application)
可选优化方案
如果你引入了androidx.activity:activity-ktx依赖,可以完全删掉自定义的Factory类,直接在Activity中用KTX扩展初始化ViewModel,系统会自动处理AndroidViewModel的Application参数注入:
// 在LoginActivity的类作用域直接声明即可,不需要在onCreate里手动初始化 val viewModel: SettingsViewModel by viewModels()
内容的提问来源于stack exchange,提问作者Ibanez1408
相关产品推荐
相关产品推荐

