Kotlin 中两种初始化 MutableLiveData 的方式有什么不同?

What are different between two ways of initial MutableLiveData in Kotlin?

代码A和代码B都初始化了一个变量MutableLiveData。

在我心里

_playA可以为空,_playA?.value不能为空

_playB可以为空,_playB?.value可以为空

对吗?

代码A

private val _playA = MutableLiveData(EPlayState.STOPPED)

代码B

private val _playB = MutableLiveData<EPlayState>()

两者

enum class EPlayState {
    STOPPED,
    PLAYING,
    PAUSED
}

新增内容

从AndroidStudio的提示信息中可以发现val aval b可以为空

图片A

图片 B

A LiveDataMutableLiveData 只是对实际数据的包装。数据可以是任何类型。 您使用 LiveData 包装数据,以便当 LiveData 中的 value 发生变化时,它会触发 Observer 侦听给它。 (为了更好地理解,请参阅 OBSERVER DESIGN PATTERN

现在回答你的问题,

_playA can be null, and _playA?.value can not be null _playB can be null, and _playB?.value can be null right?

两个 play _playA and _playB 不能为空,因为您已经使用 MutableLiveData.

初始化了它们

_playA and _playB 指的是 MutableLiveData.

实例

From the prompt information in Android Studio, you will find val a and val b can be null

是的,val a and val b 都可以为 null,因为 它们指的是 MutableLiveData 持有的 value 而不是到 MutableLiveData.

的实例

因为,MutableLiveData和LiveData是一个wrapper class(也就是持有另一个class),我们可以初始化一个 MutableLiveData 通过指定它应该持有的类型。

示例- val isBool:MutableLiveData<Boolean>=MutableLiveData()

在这种情况下,isBool.value 将给出 null,因为仅指定了 type 但未设置任何值.

但是

当我这样做的时候, val isBool:MutableLiveData<Boolean> = MutableLiveData(true) // 将一个布尔值传递给 MutableLiveData 构造函数

isBool.value 会给出 true 因为我用布尔值 true

初始化了它

你的情况也一样。

你是对的,当调用

private val _playA = MutableLiveData(EPlayState.STOPPED)

_playA.value 不为空。但是在调用 _playA.setValue(null)

之后它 可以 为空

正如其他人已经说过的,MutableLiveData 对象本身在您初始化时不会为 null。但是正如您所说,理论上您仍然可以调用 _playA = null 因此它 可以 为空。