【问题标题】:ViewModel object differenceViewModel 对象差异
【发布时间】:2020-08-30 23:06:42
【问题描述】:

在 Fragment 中使用 ViewModel 有什么区别:

viewModel = ViewModelProvider(this).get(ViewModelClass::class.java)

viewModel = activity?.let { ViewModelProvider(this).get(MainActivityViewModel::class.java) }

【问题讨论】:

    标签: android kotlin mvvm


    【解决方案1】:

    第一个是从 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>()
    

    【讨论】:

    • 谢谢你!现在我明白了其中的区别。还有一件事,在正常使用中,Fragment之间没有通信,是使用Fragment Owner好还是使用Activity好?
    • 假设如果 ViewModel 只包含不与其他 Fragment 共享的数据,它应该是该 Fragment 的本地。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多