【发布时间】: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只显示了最终得分,没有做任何改变,为什么在最终的代码示例中,在ScoreFragment的onCreateView中添加了一个观察者?
// 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