В 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()
. Есть ли у этого недостаток производительности? Есть ли лучшая практика для достижения того, чего я хочу?