我们知道,为了访问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 的概念或最佳实践吗?