如何实例化扩展AndroidViewModel的ViewModel?

问题描述 投票:0回答:1

我正在遵循一个教程,其中 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个回答
3
投票

您的

ViewModel
AndroidViewModel
的子级,它需要
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()
    
© www.soinside.com 2019 - 2024. All rights reserved.