【问题标题】:How to instantiate ViewModel that extends AndroidViewModel?如何实例化扩展 AndroidViewModel 的 ViewModel?
【发布时间】:2020-11-26 03:20:24
【问题描述】:

我正在关注一个 ViewModel 扩展抽象类以使用协程的教程,这是扩展的类:

abstract class BaseViewModel(application: Application) : AndroidViewModel(application), CoroutineScope {
private val job =  Job()

override val coroutineContext: CoroutineContext
    get() = job + Dispatchers.Main

override fun onCleared() {
    super.onCleared()
    job.cancel()
}}

这是 ViewModel:

class ViewModel(application: Application) : BaseViewModel(application) {}

所以在 MainActivity 我试图像这样实例化类:

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel = ViewModelProvider(this)[ViewModel::class.java]}

在教程中,这个家伙完美地做到了这一点,但是当我尝试运行应用程序时,它抛出了一个异常:

 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.name.nameapp.main.viewmodel.ViewModel

我觉得我错过了一些东西,你们可以指出它是什么,如果你需要更多信息,我很乐意发布它

【问题讨论】:

    标签: android kotlin mvvm abstract-class instantiation


    【解决方案1】:

    您的 ViewModelAndroidViewModel 的子级,需要 Application 对象。因此,您必须提供Factory 类才能实例化ViewModel。像这样:

    val viewModelProvider = ViewModelProvider(
         this, 
         ViewModelProvider.AndroidViewModelFactory(application)
    )
    viewModel = viewModelProvider[MainViewModel::class.java]
    

    如果您使用的是 Jetpack 的片段库

    implementation "androidx.fragment:fragment-ktx:1.2.5"
    

    您可以像这样使用属性委托:

    val viewModel: ViewModel by viewModels()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      相关资源
      最近更新 更多