Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 观察数据类的可变实时数据';s属性更改_Android_Kotlin_Viewmodel_Android Livedata - Fatal编程技术网

Android 观察数据类的可变实时数据';s属性更改

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

在中,代码提到使用backing属性在
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
变量。这是否有性能缺陷?有更好的实践来实现我想要的吗?

a
MutableLiveData
仅在
值更改时通知其观察者。未观察到课程的更改(
课程
,在您的案例中)

<>最佳实践,考虑使用一个不可变的数据类,用于<代码>课程<代码>,并在<<代码> 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