如何为 AndroidViewModel 创建视图模型工厂?
Posted
技术标签:
【中文标题】如何为 AndroidViewModel 创建视图模型工厂?【英文标题】:how to create view model factory for AndroidViewModel? 【发布时间】:2020-07-02 07:22:13 【问题描述】:我需要在创建视图模型时传递值(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")
我该怎么办?
【问题讨论】:
【参考方案1】:你可以有这样的东西:
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")
在你的活动或片段中你有:
/**
* 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)
更多详情可以查看:https://github.com/Ali-Rezaei/News-Cache/blob/master/app/src/main/java/com/sample/android/news/viewmodels/NewsViewModel.kt
【讨论】:
所以我将活动应用程序传递给 viewModel 工厂和 viewModel ?这是允许的吗?我的意思是,据我所知,我们没有将活动/片段引用到 viewModel 是的,从你的 Activity 和 Fragment 传递应用程序是完全可以的。如您所见,我在 Fragment 中对 ViewModel 进行了延迟初始化:github.com/Ali-Rezaei/News-Cache/blob/master/app/src/main/java/… 我接受了,但我还有一个问题,如果我不使用延迟初始化,会不会有问题?我通常在 onActivityCreated 上初始化 viewModel 也可以,不用懒初始化。 谢谢阿里。关于将应用程序传递给视图模型是否是一个好主意,我也有一个激烈的内在争论以上是关于如何为 AndroidViewModel 创建视图模型工厂?的主要内容,如果未能解决你的问题,请参考以下文章