Этот пример показывает использование 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 для правильной инициализации переменной finalScore
внутри ScoreFragmentViewModel
, используя аргумент, предоставленный GameFragment
, когда игра заканчивается? Так как ScoreFragment
показывает только окончательный счет без каких-либо изменений, почему в последнем примере кода был добавлен наблюдатель в onCreateView
из ScoreFragment
?
// Add observer for score
viewModel.score.observe(viewLifecycleOwner, Observer { newScore ->
binding.scoreText.text = newScore.toString()
})
У меня также есть еще один простой вопрос. Предполагая, что у меня есть два фрагмента, первый просто показывает пару TextViews, а второй предназначен для их редактирования, так что второй фрагмент является единственным, способным модифицировать базовую модель, необходимо ли создавать две модели ViewModel? Второй фрагмент должен быть инициализирован с помощью TextViews вызывающего фрагмента, реализует ли ViewModelFactory для строго обязательной инициализации этих полей или существует более простой механизм для их инициализации?