Наблюдайте изменяемые живые данные изменений свойств класса данных - PullRequest
1 голос
/ 13 апреля 2020

В Android Kotlin Основы , в коде упоминается использование свойства поддержки для инкапсуляции MutableLiveData в ViewModel, так что только сам ViewModel может изменить указанное изменяемое значение. В отличие от практики, я использую класс данных вместо этого. Я хотел бы наблюдать за изменениями в свойстве класса данных и отображать его в пользовательском интерфейсе.

Вот что у меня есть.

class CourseViewModel : ViewModel() {
    private var _lastAccessedCourse: MutableLiveData<Course>
    val lastAccessedCourse: LiveData<Course>
        get() = _lastAccessedCourse
    // Some other code...

    fun updateProgress() {
        if (_lastAccessedCourse.value != null)
            _lastAccessedCourse.value = _lastAccessedCourse.value!!.let {
                it.progress += 5
                it
            }
    }

Затем я буду наблюдать за lastAccessedCourse в моем интерфейсе, как показано ниже. Нажатие кнопки обновляет переменную progress, и я наблюдаю это изменение.

binding.fragHomeLaReadButton.setOnClickListener {
    courseViewModel.updateProgress()
}

courseViewModel.lastAccessedCourse.observe(viewLifecycleOwner, Observer {
    binding.fragHomeLaProgress.progress = it.progress
})

Мой класс данных прост.

data class Course(
    var name: String,
    var category: String,
    var progress: Int
)

Это работает. Тем не менее, у меня есть беспокойство. Когда я попытался updateProgress() без установки переменной _lastAccessedCourse (а вместо этого просто добавил 5 к прогрессу), похоже, что изменения не наблюдается. Я подозреваю, что это потому, что он не наблюдает изменения свойств класса данных. Это правильно?

Как видно, я возвращаю новую переменную Course в _lastAccessedCourse каждый раз, когда вызываю updateProgress(). Есть ли у этого недостаток производительности? Есть ли лучшая практика для достижения того, чего я хочу?

1 Ответ

1 голос
/ 13 апреля 2020

A MutableLiveData уведомляет своих наблюдателей только в случае изменения value. Изменения в классе (Course в вашем случае) не наблюдаются.

Для лучшей практики рассмотрите возможность использования неизменяемого класса данных для Course и назначения нового класса для LiveData каждый раз:

data class Course(
    val name: String,
    val category: String,
    val progress: Int
)

val course = /* TODO: get current course */
val newCourse = course.copy(progress = course.progress + 5)
_lastAccessedCourse.value = newCourse
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...