如何实例化扩展 AndroidViewModel 的 ViewModel?
How to instantiate ViewModel that extends AndroidViewModel?
我正在学习一个教程,其中 ViewModel 扩展了一个抽象 class 以便使用协程,这是扩展的 class:
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 中,我试图像这样实例化 class:
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
我觉得我遗漏了什么,你们能指出是什么吗,如果您需要更多信息,我很乐意 post 它
您的 ViewModel
是需要 Application
对象的 AndroidViewModel
的子对象。因此,您必须提供 Factory
class 才能实例化 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()
我正在学习一个教程,其中 ViewModel 扩展了一个抽象 class 以便使用协程,这是扩展的 class:
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 中,我试图像这样实例化 class:
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
我觉得我遗漏了什么,你们能指出是什么吗,如果您需要更多信息,我很乐意 post 它
您的 ViewModel
是需要 Application
对象的 AndroidViewModel
的子对象。因此,您必须提供 Factory
class 才能实例化 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()