Kotlin中初始可变LiveData的两种方式有什么不同?

Kotlin中初始可变LiveData的两种方式有什么不同?,kotlin,android-livedata,Kotlin,Android Livedata,代码A和代码B都初始化了一个变量MutableLiveData 在我心里 \u playA可以为空,\u playA?.value不能为空 \u playB可以为空,\u playB?.value可以为空 对吧? 代码A private val _playA = MutableLiveData(EPlayState.STOPPED) 代码B private val _playB = MutableLiveData<EPlayState>() 添加内容 从Android Studi

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

在我心里

\u playA
可以为空,
\u playA?.value
不能为空

\u playB
可以为空,
\u playB?.value
可以为空

对吧?

代码A

private val _playA = MutableLiveData(EPlayState.STOPPED)
代码B

private val _playB = MutableLiveData<EPlayState>()
添加内容

从Android Studio中的提示信息中,您会发现
val a
val b
可以为空

图像A

private val _playA = MutableLiveData(EPlayState.STOPPED)

图像B

private val _playB = MutableLiveData<EPlayState>()

ALiveDataMutableLiveData只是实际数据的包装。数据可以是任何类型。 使用LiveData包装数据,这样当LiveData中的值发生变化时,它会触发观察者收听。(有关更好的理解,请参见观察员设计模式)

现在回答您的问题,

_playA可以为null,_playA?.value不能为null _playB可以为null,_playB?.value可以为null 对吧?

play
\u playA和_playB
都不能为空,因为您已经用MutableLiveData对它们进行了初始化

\u playA和_playB
指的是可变livedata的实例

从Android Studio中的提示信息中,您将发现val a和val b可以为空

是的,
val a和val b
都可以为空,因为它们引用的是由MutableLiveData持有的值,而不是MutableLiveData的实例

由于,MutableLiveData和LiveData是一个包装类(即,保存另一个类),我们可以通过指定它应该保存的类型来初始化MutableLiveData

示例-
val-isBool:MutableLiveData=MutableLiveData()

在这种情况下,
isBool.value
将给出null,因为只指定了类型,但没有设置值

但是

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

isBool.value
将给出true,就像我用布尔值true初始化它一样


在您的情况下也是如此。

您打电话的时候说得对

private val _playA = MutableLiveData(EPlayState.STOPPED)
\u playA.value
不为空。但是调用
\u playA.setValue(null)

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