如何为 AndroidViewModel 创建视图模型工厂?
how to create view model factory for AndroidViewModel?
创建视图模型时需要传值(userData),所以需要创建视图模型工厂
这是我的 viewModel,我需要 application
和 userData
来初始化这个 ScoreViewModel
class ScoreViewModel(application: Application, userData: UserKM) : AndroidViewModel(application) {
}
但现在我很困惑如何在创建 viewModel 工厂时传递 application
class ScoreViewModelFactory(private val userData: UserKM) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ScoreViewModel::class.java)) {
return ScoreViewModel(userData = userData,application = ?????? ) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
我该怎么办?
你可以有这样的东西:
class Factory(val app: Application) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(NewsViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return NewsViewModel(app) as T
}
throw IllegalArgumentException("Unable to construct viewmodel")
}
}
在您的 activity 或您的片段中:
/**
* One way to delay creation of the viewModel until an appropriate lifecycle method is to use
* lazy. This requires that viewModel not be referenced before onActivityCreated, which we
* do in this Fragment.
*/
private val viewModel: NewsViewModel by lazy {
val activity = requireNotNull(this.activity) {
"You can only access the viewModel after onActivityCreated()"
}
ViewModelProviders.of(this, NewsViewModel.Factory(activity.application))
.get(NewsViewModel::class.java)
}
在这里你的 viewModel 看起来像:
class NewsViewModel(application: Application) : AndroidViewModel(application)
创建视图模型时需要传值(userData),所以需要创建视图模型工厂
这是我的 viewModel,我需要 application
和 userData
来初始化这个 ScoreViewModel
class ScoreViewModel(application: Application, userData: UserKM) : AndroidViewModel(application) {
}
但现在我很困惑如何在创建 viewModel 工厂时传递 application
class ScoreViewModelFactory(private val userData: UserKM) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(ScoreViewModel::class.java)) {
return ScoreViewModel(userData = userData,application = ?????? ) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
我该怎么办?
你可以有这样的东西:
class Factory(val app: Application) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(NewsViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return NewsViewModel(app) as T
}
throw IllegalArgumentException("Unable to construct viewmodel")
}
}
在您的 activity 或您的片段中:
/**
* One way to delay creation of the viewModel until an appropriate lifecycle method is to use
* lazy. This requires that viewModel not be referenced before onActivityCreated, which we
* do in this Fragment.
*/
private val viewModel: NewsViewModel by lazy {
val activity = requireNotNull(this.activity) {
"You can only access the viewModel after onActivityCreated()"
}
ViewModelProviders.of(this, NewsViewModel.Factory(activity.application))
.get(NewsViewModel::class.java)
}
在这里你的 viewModel 看起来像:
class NewsViewModel(application: Application) : AndroidViewModel(application)