使用片段之间的参数进行正确的ViewModel初始化。

问题描述 投票:0回答:1

这个 例子 展示了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来正确初始化ViewModelFactory?finalScore 内的变量 ScoreFragmentViewModel 通过使用 GameFragment 当游戏结束时?由于 ScoreFragment 只显示最终得分而不做任何修改,为什么在最后的代码示例中增加了一个观察者,在 onCreateViewScoreFragment?

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

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

android android-fragments arguments fragment viewmodel
1个回答
0
投票

当然你提到的例子是比较有教育意义的,也许它与实际项目并不相似。对于你的问题,我尽量给出我的想法。

  1. 例子中的 ScoreViewModel 只有一个值,而且永远不会改变。所以不需要观察它的变化,这就是为什么这个值不是LiveData,也不需要使用

    viewModel.score.value.toString()

  2. 如果你的ViewModel在构造函数中没有参数,你可以跳过ViewModelFactory。所以你可以让你的ScoreViewModel没有参数,但要为 "score "字段使用某种公共设置器(并从捆绑的ScoreFragment中用最终得分来设置它)。在某些情况下,这也许不是推荐的方式。我认为他们写了那个说明来强调你可以使用不同的情况来初始化ViewModel。也许这不是很优雅的方式 :-)

  3. 我找不到你提到的下一段代码(它不应该在那里,因为 "分数 "无法被观察到)。

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

  4. 至于两个片段你的问题不清楚。如果你想让它们共享一些数据范围(相同的数据),你可以使用 共享ViewModel. 例如,共享的ViewModel可以容纳两个LiveData-字符串,那么第一个片段可以仅仅 "显示 "这些字符串(不管是什么TextViews),而第二个片段可以 "编辑 "它们。

© www.soinside.com 2019 - 2024. All rights reserved.