如何为 AndroidViewModel 创建视图模型工厂?

Posted

技术标签:

【中文标题】如何为 AndroidViewModel 创建视图模型工厂?【英文标题】:how to create view model factory for AndroidViewModel? 【发布时间】:2020-07-02 07:22:13 【问题描述】:

我需要在创建视图模型时传递值(userData),所以我需要创建一个视图模型工厂

这是我的 viewModel,我需要 applicationuserData 来初始化这个 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 创建视图模型工厂?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Swift 3 创建第一个视图

如何为拆分视图控制器创建启动页面

Xcode:如何为使用 Storyboard 创建的子视图设置委托?

如何为 iOS 应用创建自定义容器视图?

如何为提示从图库或相机胶卷拍照的按钮创建警报视图?

如何为列表视图创建自定义适配器?获取 ResourceNotFoundException