为什么 LiveData 比 MutableLiveData 更好?

4

在许多样本中,我看到以下内容:

 class DataViewModel{
         val data:LivaData<Int>
             get() = _data 

         private val _data = MutableLiveData<Int>()

    }

但更简单的方式是这样的:
 class DataViewModel{
         val data = MutableLiveData<Int>()

    }

所以,为什么需要使用两个字段来构建这种更复杂的代码呢?

因此,您的视图模型的依赖项无法更新可变 LiveData 对象的值。 - RedShirt
@JohnnyWineShirt,请给我更多开放的答案,为什么这很重要,谢谢。 - Serg Burlaka
所有这些 get() 没有太多意义。用户仍然可以在 DataViewModel 之外将数据转换为 MutableLiveData 并随心所欲地进行操作。 - ror
3个回答

7

这是一种旨在限制类外部修改值的做法。

LiveData 是只读的。 MutableLiveData 如其名,允许修改其持有的值。

如果像您的第二个例子那样直接公开一个 MutableLiveData,任何能够访问该 data 字段的代码都可以修改它所持有的值。

DataViewModel 类外部暴露更改 data 内容的能力可能会使调试和推理 data 的内容来自于何处变得更加困难。


5

MutableLiveData本质上是一个具有公共访问两个方法setValue()postValue()以修改数据的LiveData

因此,如果您打算修改LiveData的值,则需要使用MutableLiveData

然而,在编程中,使变量不可变或限制可以修改对象数据的人的访问是常见的概念。如果没有必要,您不会希望公开修改对象内部变量内容的能力。

因此,对于MutableLiveData,我们通常使用getter获取其父表单LiveData

仅获取LiveData,我们可以确保访问LiveData对象的人只能读取其中存储的值,无法更改它们。

从某种意义上说,这就是为什么您应该使用具有getter的私有变量的概念。


1

LiveData 是不可变的。在 LiveData 中,setValue()postValue() 方法不是公共的,数据只读,而 MutableLiveData 是可变的 LiveData,可以访问并更改数据。 此外,当定义 var data = MutableLiveData<Int>() 时,允许公共访问一个变量,这可能不符合“封装”原则。

private var count = MutableLiveData<Int>()
    val countValue : LiveData<Int>
    get() = count

我们定义了一个公共的LiveData值来进行共享,使得它能够获取“count”的值作为该LiveData的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接