android - 为 AndroidViewModel 创建 ViewModelFactory 的正确方法是什么
问题描述
我正在尝试使用 AndroidViewModel 而不是常规的 ViewModel,因为 AndroidViewModel 包含绑定服务所需的应用程序引用。
我的问题是,如何向 ViewModelFactory 提供应用程序参数?
目前我正在从 ViewModelFactory 注入器实用程序已经可用的 ApplicationContext 中投射它,但我读过这很危险,因为 ApplicationContext 的投射可能并不总是返回 application。
我只是在学习Android,跟随向日葵的例子,所以答案可能很简单。我只是不知道。. . 然而。(希望你能帮忙)。
这是我目前的做法,您可能会注意到,这与 Google 在 Sunflower 示例中的做法密切相关:
使用 AndroidViewModel 的片段
class GalleryFragment : Fragment() {
private lateinit var viewModel: GalleryViewModel
private var memoList: List<Memo> = emptyList()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.gallery_fragment, container, false)
val context = context ?: return view
val factory = InjectorUtils.provideGalleryViewModelFactory(context)
viewModel = ViewModelProviders.of(this, factory).get(GalleryViewModel::class.java)
...
注射器实用程序
object InjectorUtils {
fun provideMemoViewModelFactory(context: Context, memoId: Long): MemoViewModelFactory {
val application = context.applicationContext as Application //this could be dangerous
val repository = getMemoRepository(context)
return MemoViewModelFactory(application, repository, memoId)
}
}
视图模型工厂
class MemoViewModelFactory(
private val application: Application,
private val memoRepository: MemoRepository,
private val memoId: Long
) : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MemoViewModel( application, memoRepository, memoId) as T
}
}
视图模型
class MemoViewModel(
application: Application,
memoRepository: MemoRepository,
private val memoId: Long
) : AndroidViewModel(application) {
...
我关心的是 InjectorUtil 内部,我通过转换 applicationContext 来获得对应用程序的引用。如果我沿着这条路继续前进,我是否会遇到麻烦?在其他地方我应该添加应用程序引用,在那里我可以直接访问它而不是通过 applicationContext 的转换?
谢谢
约翰
解决方案
推荐阅读
- java - 如何通过 Springboot 服务的 2 个实例从共享位置并行访问文件?
- akka-http - akka-http中的拒绝和异常有什么区别
- reactjs - 使用 React 的 Azure Bot Framework 出现问题
- python - 使用事件按钮时的位置参数
- twilio - 是否可以将 Twilio CallSid 与 PIN 码相关联?
- javascript - 为什么这个 CSS 图像预加载解决方案只适用于 Chrome 和 Opera?
- php - Laravel 多邮件配置和多并发用户
- microsoft-graph-api - 通过事件消息获取特定事件版本
- google-apps-script - 触发器处理和可见性 (GAS) - 管理的最佳方式
- node.js - 关联数组显示空值