android 为什么要用瓦尔类型声明mutableLiveData类?

qvtsj1bj  于 2023-04-04  发布在  Android
关注(0)|答案(1)|浏览(236)

为什么不使用瓦尔类型的mutableLiveData作为var类型的替代?
可以在瓦尔类型上设置,这不是一个违规吗?
比如说
1.瓦尔类型示例

class LoadDetailViewModel : ViewModel() {

    private val _liveData = MutableLiveData<String>()
    val liveData: LiveData<String> get() = _liveData

    fun loadData() = viewModelScope.launch {
        _liveData.value = "value"
        _liveData.postValue("value")
    }
}

1.代码更改为var类型

class LoadDetailViewModel : ViewModel() {

    private var _liveData = MutableLiveData<String>()
    var liveData: LiveData<String> get() = _liveData

    fun loadData() = viewModelScope.launch {
        _liveData.value = "value"
        _liveData.postValue("value")
    }
}

但是结果仍然是等价的,当我把mutableLiveData声明为var时没有错误,但是我不知道为什么要把它声明为val。

  • 我知道Kotlin语言中的瓦尔类型是不可变的,而var类型是可变的。
  • 那么把它声明为var类型不是正确的吗?

Android Developers我查了Android的官方文档,但没有答案。

c0vxltue

c0vxltue1#

当你调用_liveData.value = "value"时,注意你没有使用_liveData =。所以你没有改变_liveData属性,它也不需要是var。你改变的是MutableLiveData内部的属性。
使用var是错误的,因为你没有换出MutableLiveData的示例。如果你把它改为一个不同的示例,你的观察者不会得到通知。
你混淆了属性(包含对MutableLiveData示例的引用)和类(MutableLiveData本身)的可变性。MutableLiveData是一个可变类,因为它内部有可变变量。你可以改变它,但你不想改变包含对它的引用的属性。
使用var不会引起任何问题,因为您实际上没有使用可变性来更改对不同示例的引用。但是,由于您永远不应该这样做,因此没有理由使用var而不是val。使用val可以使代码更清晰,更健壮。

相关问题