Android 片段中包含应用程序上下文和额外参数的ViewModel
我们知道,为了访问Android 片段中包含应用程序上下文和额外参数的ViewModel,android,kotlin,android-architecture-components,android-viewmodel,android-architecture,Android,Kotlin,Android Architecture Components,Android Viewmodel,Android Architecture,我们知道,为了访问应用程序需要查找资源字符串或系统服务的上下文,我们使用AndroidViewModel扩展了ViewModel,同时向ViewModel传递额外参数需要一个扩展ViewModelProvider.NewInstanceFactory()的工厂。我的问题是,当您使用AndroidViewModel时,在构建视图模型时不需要将Application作为参数传递,但当使用工厂时,您需要传递应用程序上下文以及额外的参数 当只使用AndroidViewModel时,getActivity
应用程序
需要查找资源字符串或系统服务的上下文,我们使用AndroidViewModel
扩展了ViewModel,同时向ViewModel传递额外参数需要一个扩展ViewModelProvider.NewInstanceFactory()
的工厂。我的问题是,当您使用AndroidViewModel
时,在构建视图模型时不需要将Application
作为参数传递,但当使用工厂时,您需要传递应用程序上下文以及额外的参数
当只使用AndroidViewModel
时,getActivity().getApplication()是否在内部完成?
在片段中显式地将getActivity().getApplication()
传递给ViewModel工厂可以吗
样品
仅需要应用程序上下文的ViewModel
class AssetViewModel(application: Application) : AndroidViewModel(application) {
}
上面的ViewModel可以像默认的方式一样在片段中构造
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){
}
这是否正确且不违反使用ViewModel的概念或最佳实践?在java中,当您通过
AndroidViewModel
创建ViewModel时,必须传递应用程序参数,因此对于问题:
getActivity()
使用AndroidViewModel
您已将应用程序上下文显式传递给AndroidViewModel
。在该类中有一个方法getApplication()
,用于接收传递的参数。第二条:
在中显式传递getActivity().getApplication()可以吗
片段到您的ViewModel工厂
绝对没问题
val viewModel = ViewModelProvider(this, NewsVideoViewModelFactory(requireActivity().application, baseUrl)).get(
NewsVideoViewModel::class.java)