首页 > 解决方案 > 片段中具有应用程序上下文和额外参数的 ViewModel

问题描述

我们知道,为了访问Application需要查找资源字符串或系统服务的上下文,我们扩展了我们的 ViewModel ,AndroidViewModel同时将额外的参数传递给 ViewModel 需要一个扩展的工厂ViewModelProvider.NewInstanceFactory()。我的问题是,当您使用时,AndroidViewModel您不需要Application在构造 ViewModel 时作为参数传递,但是在使用工厂时,您需要传递 Application 上下文以及额外的参数。

仅在使用 getActivity().getApplication() 时是否在内部完成AndroidViewModel?可以将 Fragment显式传递getActivity().getApplication()给您的 ViewModel 工厂吗?

样本

只需要应用程序上下文的 ViewModel

class AssetViewModel(application: Application) : AndroidViewModel(application) {

}

上面的 ViewModel 可以像默认方式一样在 Fragment 中构建。

val assetViewModel = ViewModelProvider(this).get(AssetViewModel::class.java)

但是,对于工厂,您将这样做

class NewsVideoViewModelFactory(private val application: Application, private val baseUrl: String) : ViewModelProvider.NewInstanceFactory() {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        @Suppress("UNCHECKED_CAST")
        return NewsVideoViewModel(application, baseUrl) as T
    }

}

class NewsVideoViewModel(application: Application, baseUrl: String) : AndroidViewModel(application){

   

}

然后像这样构造它并依赖于Activity

val viewModel = ViewModelProvider(this, NewsVideoViewModelFactory(requireActivity().application, baseUrl)).get(
            NewsVideoViewModel::class.java)

这是正确的,并且不违反使用 ViewModel 的概念或最佳实践吗?

标签: androidkotlinandroid-architecture-componentsandroid-viewmodelandroid-architecture

解决方案


在java中,当您通过创建ViewModel时AndroidViewModel,您必须传递Application参数,所以对于问题:

仅使用 AndroidViewModel 时,getActivity().getApplication() 是否在内部完成?

您已将 Application 上下文显式传递给AndroidViewModel. 在那个类中有一个方法getApplication()来接收传递的参数。第二个:

可以将 Fragment 中的 getActivity().getApplication() 显式传递给您的 ViewModel 工厂吗?

绝对没问题


推荐阅读