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 a
和val b
可以为空
图片A
图片 B
A LiveData 或 MutableLiveData 只是对实际数据的包装。数据可以是任何类型。
您使用 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
因此它 可以 为空。
代码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 a
和val b
可以为空
图片A
图片 B
A LiveData 或 MutableLiveData 只是对实际数据的包装。数据可以是任何类型。 您使用 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
因此它 可以 为空。