android - 片段中具有应用程序上下文和额外参数的 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 的概念或最佳实践吗?
解决方案
在java中,当您通过创建ViewModel时AndroidViewModel
,您必须传递Application参数,所以对于问题:
仅使用 AndroidViewModel 时,getActivity().getApplication() 是否在内部完成?
您已将 Application 上下文显式传递给AndroidViewModel
. 在那个类中有一个方法getApplication()
来接收传递的参数。第二个:
可以将 Fragment 中的 getActivity().getApplication() 显式传递给您的 ViewModel 工厂吗?
绝对没问题
推荐阅读
- python - 如何在linux的python列表中使用xdotool ctrl+c数据保存url
- c++ - 如何从mingw、c++(或c)获取和设置环境变量
- linux - 为什么我的 bash 代码在写入文件时会发生变化?
- node.js - Delphi 和 Node.js 之间的 SHA256 差异
- c# - 解析不同的HttpClient
- python - concurrent.futures 不适用于 ubuntu 18.04 和 centosos 7
- python - 创建自定义图像数据集时出现 numpy 数组形状的问题
- amazon-web-services - 如何从通配符记录中排除子域
- linqkit - 如何使用 PredicateBuilder 在内部导航上应用可重用表达式?
- java - 在调用 repaint() 之前,paintComponent 不会绘制所有内容