【问题标题】:how to create view model factory for AndroidViewModel?如何为 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")
    }

}

我该怎么办?

【问题讨论】:

    标签: android kotlin android-architecture-components android-jetpack android-viewmodel


    【解决方案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
    • 也可以,不用懒初始化。
    • 谢谢阿里。关于将应用程序传递给视图模型是否是一个好主意,我也有一个激烈的内在争论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2019-06-21
    相关资源
    最近更新 更多