带有应用程序上下文和 Fragment 中额外参数的 ViewModel

问题描述

我们知道,为了访问 Application 上下文,例如需要查找资源字符串或系统服务,我们使用 Androidviewmodel 扩展我们的 viewmodel,同时将额外的参数传递给 viewmodel 需要一个扩展 {{ 1}}。我的问题是,当您使用 viewmodelProvider.NewInstanceFactory() 时,您不需要在构建 viewmodel 时将 Androidviewmodel 作为参数传递,但在使用工厂时,您需要将应用程序上下文与额外参数一起传递。

当只使用 Application 时,getActivity().getApplication() 是否在内部完成? 是否可以将 Fragment 中的 Androidviewmodel 显式传递给您的 viewmodel 工厂?

样品

只需要应用上下文的viewmodel

getActivity().getApplication()

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

class Assetviewmodel(application: Application) : Androidviewmodel(application) {

}

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

val assetviewmodel = viewmodelProvider(this).get(Assetviewmodel::class.java)

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

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){

   

}

这是否正确且不违反使用 viewmodel 的概念或最佳实践?

解决方法

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

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

您已明确地将应用程序上下文传递给 AndroidViewModel。在那个类中有一个方法 getApplication() 来接收传递的参数。第二个:

显式传入getActivity().getApplication()可以吗 片段到您的 ViewModel 工厂?

完全没问题