Android 观察数据类的可变实时数据';s属性更改
在中,代码提到使用backing属性在Android 观察数据类的可变实时数据';s属性更改,android,kotlin,viewmodel,android-livedata,Android,Kotlin,Viewmodel,Android Livedata,在中,代码提到使用backing属性在ViewModel中封装MutableLiveData,以便只有ViewModel本身可以更改所述可变值。与实践不同,我使用的是数据类。我希望观察对数据类属性的更改,并将其显示在UI中 这是我到目前为止所拥有的 class CourseViewModel : ViewModel() { private var _lastAccessedCourse: MutableLiveData<Course> val lastAccessed
ViewModel
中封装MutableLiveData
,以便只有ViewModel
本身可以更改所述可变值。与实践不同,我使用的是数据类。我希望观察对数据类属性的更改,并将其显示在UI中
这是我到目前为止所拥有的
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
}
}
我的数据类很简单
data class Course(
var name: String,
var category: String,
var progress: Int
)
这很有效。然而,我有一个担忧。当我试图updateProgress()
而没有设置\u lastAccessedCourse
变量(而只是将5
添加到进度中)时,似乎没有观察到更改。我怀疑这是因为它没有观察到数据类的属性更改。这是正确的吗
可以看出,每次调用
updateProgress()
时,我都会将一个新的课程
返回到\u lastAccessedCourse
变量。这是否有性能缺陷?有更好的实践来实现我想要的吗?aMutableLiveData
仅在值更改时通知其观察者。未观察到课程的更改(课程
,在您的案例中)
<>最佳实践,考虑使用一个不可变的数据类,用于<代码>课程<代码>,并在<<代码> LIFEDATA < /代码>中分配新的一个:
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
这和我做的基本上不一样吗?基本上是的,但你要求最佳实践。啊,好的。我重读了你的答案,你的答案和我的不同,因为你的数据类是不变的。
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