【发布时间】:2020-08-30 23:06:42
【问题描述】:
在 Fragment 中使用 ViewModel 有什么区别:
viewModel = ViewModelProvider(this).get(ViewModelClass::class.java)
和
viewModel = activity?.let { ViewModelProvider(this).get(MainActivityViewModel::class.java) }
【问题讨论】:
在 Fragment 中使用 ViewModel 有什么区别:
viewModel = ViewModelProvider(this).get(ViewModelClass::class.java)
和
viewModel = activity?.let { ViewModelProvider(this).get(MainActivityViewModel::class.java) }
【问题讨论】:
第一个是从 Activity 或 Fragment 调用的,并将自身作为 ViewModel 的所有者传递。第二个看起来像是从想要使用其附加活动作为 ViewModel 所有者的 Fragment 调用的。并且作者似乎是 !!-averse 到了使用 ?.let 的地步,即使在已知 activity 不为空的生命周期阶段也是如此。代码可以改成
viewModel = ViewModelProvider(requireActivity()).get(MainActivityViewModel::class.java)
或
viewModel = ViewModelProvider(activity!!).get(MainActivityViewModel::class.java)
大概,当activity 为空时,您不会调用它。您通常在启动时获取 ViewModel,而不是在某些回调中。
如果您使用不当,requireActivity() 将为您提供比 activity!! 更多信息的异常,但在实践中,如果您熟悉 Fragment 生命周期,很容易看出问题所在。
但由于 Jetpack 库包含 viewModels() 属性委托,因此以上所有内容都是不必要的。您可以在属性声明站点获取视图模型,而无需将其设为var:
val viewModel by viewModels<MainActivityViewModel>()
【讨论】: