【问题标题】:Proper ViewModel initialization using arguments between fragments使用片段之间的参数正确初始化 ViewModel
【发布时间】:2020-04-24 18:45:04
【问题描述】:

这个example 展示了 ViewModel 的用法以及如何创建一个 ViewModelFactory 来初始化一个传递一个参数的 ViewModel。在示例的末尾有一条注释说:

Note: In this app, it's not necessary to add a ViewModelFactory for the ScoreViewModel, because you can assign the score directly to the viewModel.score variable. But sometimes you need the data right when the viewModel is initialized.

事实上,为了填充ScoreFragment 的最终分数,它说要执行以下操作

binding.scoreText.text = viewModel.score.toString()

但是,这不是错误的吗?不应该将binding.scoreText.text 分配给viewModel.score.value.toString() 吗?以及如何避免使用 ViewModelFactory 在游戏结束时使用 GameFragment 提供的参数正确初始化 ScoreFragmentViewModel 内的 finalScore 变量?既然ScoreFragment只显示了最终得分,没有做任何改变,为什么在最终的代码示例中,在ScoreFragmentonCreateView中添加了一个观察者?

    // Add observer for score
    viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->
        binding.scoreText.text = newScore.toString()
    })

我还有一个简单的问题。 假设我有两个片段,第一个只是显示几个 TextView,第二个是编辑它们,所以第二个片段是唯一能够修改底层模型的片段,是否有必要创建两个 ViewModel?第二个片段应该使用调用片段的 TextViews 进行初始化,是实现 ViewModelFactory 来初始化那些严格必要的字段还是有更简单的机制来初始化它们?

【问题讨论】:

    标签: android android-fragments arguments fragment viewmodel


    【解决方案1】:

    你提到的例子当然是相当有教育意义的,也许它与实际项目不相似。对于您的问题,我将尝试给出我的想法:

    1. 示例中的ScoreViewModel 只包含一个值,而且它实际上永远不会改变。所以不需要观察它的变化,这就是为什么这个值不是 LiveData 并且不需要使用

      viewModel.score.value.toString()

    2. 如果您的 ViewModel 在构造函数中没有参数,您可以跳过 ViewModelFactory。因此,您可以制作不带参数的 ScoreViewModel,而是使用某种公共 setter 字段“得分”(并从 ScoreFragment 设置它,并从捆绑包中获得最终得分)。在某些情况下,这可能不是推荐的方式。我认为他们写该注释是为了强调可用于初始化 ViewModel 的不同场景。也许这不是很优雅的方式:-)

    3. 我找不到使用您提到的下一个代码(它不应该存在,因为无法观察到“分数”)

      viewModel.score.observe(viewLifecycleOwner, Observer { newScore -> binding.scoreText.text = newScore.toString() })

    4. 关于这两个片段,您的问题并不清楚。如果您希望他们共享某些范围的数据(相同的数据),您可以使用shared ViewModel。例如,共享的 ViewModel 可以保存两个 LiveData 字符串,然后第一个片段可以“显示”这些字符串(无论是 TextViews),第二个片段可以“编辑”它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 2015-05-23
      • 2021-04-13
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多