为什么用等号 (=) 声明 MutableLiveData 变量?

Why are MutableLiveData variables declared with equals sign (=)?

在Kotlin中,声明变量的类型时,使用冒号。即使在声明 LiveData 时,也会使用冒号。那么为什么 等号 用于 MutableLiveData?我一直无法弄清楚这一点。几天前我花了大约 2 个小时试图理解为什么我的 MutableLiveData 变量不起作用只是为了意识到我需要一个等号而不是冒号。

示例:

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

提前致谢!

So why is an equals sign used for MutableLiveData?

因为您正在通过其构造函数创建 MutableLiveData 的实例。您没有提供类型——Kotlin 编译器根据您分配给 属性.

的对象类型推断它

基本上,您的声明是 shorthand for:

private val _liveData: MutableLiveData<Int> = MutableLiveData<Int>()

您可以在 Google's Kotlin docs 中了解有关类型推断的更多信息。

Kotlin 自动检测类型,所以你不需要指定它。这些是等价的

val foo: Int = 123
val foo = 123

但是,如果你有一个稍后初始化的变量,你必须提供类型,否则编译器无法确定它是什么类型。例如,

class MyClass {
    val foo: Int  // must specify type

    init {
        foo = /* compute foo */
    }
}

LiveDataMutableLiveData无关。

val liveData: LiveData<Int>

本身没有意义。它还需要初始化。我怀疑您正在查看 Android 编程中的一个相当常见的习语,但错过了下一行仍然是 liveData:

定义的一部分
val liveData: LiveData<Int>
  get() = _liveData

这里你需要 : LiveData<Int> 的原因只是因为否则 Kotlin 会为 liveData_liveData 推断出相同的类型 MutableLiveData<Int>成语是阻止其他类在其上调用postValue/setValue