为什么不使用val类型的mutableelivedata作为var类型的替代品?
可以在val类型上设置,这不是一种违反吗?
例如:
- val类型 的示例
class LoadDetailViewModel : ViewModel() {
private val _liveData = MutableLiveData<String>()
val liveData: LiveData<String> get() = _liveData
fun loadData() = viewModelScope.launch {
_liveData.value = "value"
_liveData.postValue("value")
}
}
- 代码改为var type
class LoadDetailViewModel : ViewModel() {
private var _liveData = MutableLiveData<String>()
var liveData: LiveData<String> get() = _liveData
fun loadData() = viewModelScope.launch {
_liveData.value = "value"
_liveData.postValue("value")
}
}
但是结果仍然是等价的。没有错误,当我声明mutableelvedata为var,但我不知道为什么我必须声明它为val。
- 我理解在Kotlin语言的val类型是一个不可变的类型,var类型是一个可变的类型。
- 那么将其声明为var类型不是正确的吗?
Android开发者我查阅了Android的官方文件,但是没有答案。
当您调用_liveData.value = "value"
时,请注意您没有使用_liveData =
。所以你没有改变属性_liveData
也不需要是var
。你正在mutableelivedata 内部改变属性。
使用var
是错误的,因为您没有交换出MutableLiveData
的实例。如果您将它更改为其他实例,则不会通知您的观察者。
你混淆了属性(保存MutableLiveData实例引用的东西)和类(MutableLiveData本身)的可变性。mutableelvedata是一个可变类,因为它内部有可变变量。你可以改变它,但是你不希望改变持有它的引用的属性。
使用var
不会引起任何问题,因为您实际上没有使用可变性来更改对不同实例的引用。但是,由于您永远不应该这样做,因此没有理由使用var
而不是val
。使用val
可以使代码更清晰,更健壮。