Каким образом наблюдаемые жизненные данные со вспомогательным свойством mutablelivedata могут вызывать наблюдателей, когда они никогда не обновляются напрямую? - PullRequest
1 голос
/ 17 мая 2019

Я слежу за проектом Google android «угадай это» через udacity, где они вводят liveata и mutablelivedata.Мы дошли до того, что мы создаем жилатые данные, эквивалентные объекту mutablelivedata, и создаем обратное свойство get () для жилой информации для экземпляра mutablelivedata.Мы вносим все изменения в данные в viewModel, используя экземпляр mutablelivedata.Фрагмент нашего пользовательского интерфейса устанавливает наблюдателей на объекты liveata viewModel, а не на объекты mutablelivedata.

Несмотря на то, что наблюдатель находится на экземпляре livingata, а не на экземпляре mutablelivedata, когда объект mutablelivedata обновляется, код наблюдателя liveata запускается,Мне нравится, что это работает так, но я не совсем понимаю, как это работает.Кто-нибудь может мне это объяснить?

В ViewModel

val _word = MutableLiveData<String>()
val word : LiveData<String>
        get() = _word

Редактировать в ViewModel

private fun nextWord() {
    //Select and remove a word from the list
    if (wordList.isEmpty()) {
        //gameFinished()
    } else {
        _word.value = wordList.removeAt(0)
    }
}

Во фрагменте пользовательского интерфейса

viewModel.word.observe(this, Observer{newWord ->
            binding.wordText.text = newWord
        })

1 Ответ

1 голос
/ 18 мая 2019

Фрагмент нашего пользовательского интерфейса устанавливает наблюдателей для объектов liveata viewModel, а не объектов mutablelivedata.

Это один и тот же объект._word и word оба указывают на MutableLiveData.Однако с точки зрения типа данных word определяется как LiveData, чтобы скрыть детали реализации от фрагмента.

Итак, наблюдатели размещаются на том же объекте, который получает значениеобновления.

Лично я предпочитаю писать этот код как:

private val _word = MutableLiveData<String>()
val word : LiveData<String> = _word

... как ИМХО, который легче читать и имеет тот же эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...