【问题标题】:Why are MutableLiveData variables declared with equals sign (=)?为什么 MutableLiveData 变量用等号 (=) 声明?
【发布时间】:2020-10-14 02:57:40
【问题描述】:

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

示例:

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

提前致谢!

【问题讨论】:

    标签: android kotlin android-livedata observers mutablelivedata


    【解决方案1】:
    val liveData: LiveData<Int>
    

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

    val liveData: LiveData<Int>
      get() = _liveData
    

    这里你需要: LiveData&lt;Int&gt;的原因只是因为否则Kotlin会为liveData推断出与_liveData相同的类型MutableLiveData&lt;Int&gt;,而这个成语的全部意义在于阻止其他类调用@987654328 @/setValue 就可以了。

    【讨论】:

      【解决方案2】:

      Kotlin 自动检测类型,因此您无需指定它。这些是等价的

      val foo: Int = 123
      val foo = 123
      

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

      class MyClass {
          val foo: Int  // must specify type
      
          init {
              foo = /* compute foo */
          }
      }
      

      LiveDataMutableLiveData无关。

      【讨论】:

        【解决方案3】:

        那么为什么 MutableLiveData 使用等号呢?

        因为您正在通过其构造函数创建MutableLiveData 的实例。您没有提供类型 - Kotlin 编译器是从您分配给属性的对象的类型推断它。

        基本上,您的陈述是以下内容的简写:

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

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

        【讨论】:

        • 所以这意味着编译器推断出一种LiveData?我知道如果我编写一个类,我可以使用等号声明该类的一个变量。 LiveData 是一个类型而 MutableLiveData 是一个类吗?
        • @JamesFutures:“所以这意味着编译器推断出一种 LiveData?” -- 不,它推断出MutableLiveData 的类型。您正在创建MutableLiveData 的实例。 “LiveData 是一个类型,而 MutableLiveData 是一个类吗?” -- LiveData is a classMutableLiveDataa subclass of LiveData
        • : MutableLiveData&lt;Int&gt;,而是。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多