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

sar*_*rah 7 android kotlin android-viewmodel android-architecture-components android-jetpack

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

这是我的 viewModel,我需要applicationuserData初始化它ScoreViewModel

class ScoreViewModel(application: Application, userData: UserKM) : AndroidViewModel(application) {



}
Run Code Online (Sandbox Code Playgroud)

但现在我很困惑如何application在创建 viewModel 工厂时通过

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")
    }

}
Run Code Online (Sandbox Code Playgroud)

我该怎么办 ?

Ali*_*Ali 9

你可以有这样的事情:

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")
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的活动或片段中,您有:

/**
     * 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)
    }
Run Code Online (Sandbox Code Playgroud)

在这里你的 viewModel 看起来像:

class NewsViewModel(application: Application) : AndroidViewModel(application)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您可以查看:https : //github.com/Ali-Rezaei/News-Cache/blob/master/app/src/main/java/com/sample/android/news/viewmodels/NewsViewModel.kt

  • 所以我将活动应用程序传递给 viewModel 工厂和 viewModel ?这是允许的吗?我的意思是,据我所知,我们不会从活动/片段到 viewModel 进行引用 (2认同)