Kotlin 为什么LiveData的getValue是<;长期>;可为空?

Kotlin 为什么LiveData的getValue是<;长期>;可为空?,kotlin,Kotlin,代码是基于 我修改了一些代码 我认为emit(timeStampToTime(currentTime.value))是正确的,但是系统报告错误,所以我必须使用emit(timeStampToTime(currentTime.value?:0)) 1:我很奇怪为什么val currentTime不可为空,而currentTime.value可为空 2:为什么原始代码使用liveData{emit(timeStampToTime(it))}而不是liveData{emit(timeStampToTi

代码是基于

我修改了一些代码

我认为
emit(timeStampToTime(currentTime.value))
是正确的,但是系统报告错误,所以我必须使用
emit(timeStampToTime(currentTime.value?:0))

1:我很奇怪为什么
val currentTime
不可为空,而
currentTime.value
可为空

2:为什么原始代码使用
liveData{emit(timeStampToTime(it))}
而不是
liveData{emit(timeStampToTime(it?:0))}

代码A

class LiveDataViewModel(
    private val dataSource: DataSource
) : ViewModel() {

    val currentTime = dataSource.getCurrentTime()

    val currentTimeTransformed: LiveData<String> = liveData {
       //emit(timeStampToTime(currentTime.value))  // It will cause error     
       emit(timeStampToTime(currentTime.value?:0))

    }


    //Original Code
    // Coroutines inside a transformation
    //  val currentTimeTransformed = currentTime.switchMap {
    //   timeStampToTime is a suspend function so we need to call it from a coroutine.
    //    liveData { emit(timeStampToTime(it)) }
    // }

    private suspend fun timeStampToTime(timestamp: Long): String {
        delay(500)  // Simulate long operation
        val date = Date(timestamp)
        return date.toString()
    }

}



class DefaultDataSource(private val ioDispatcher: CoroutineDispatcher) : DataSource {

    override fun getCurrentTime(): LiveData<Long> =
        liveData {
            while (true) {
                emit(System.currentTimeMillis())
                delay(1000)
            }
        }
   ...
}
类LiveDataViewModel(
私有val数据源:数据源
):ViewModel(){
val currentTime=dataSource.getCurrentTime()
val currentTimeTransformed:LiveData=LiveData{
//emit(timeStampToTime(currentTime.value))//它将导致错误
发出(timeStampToTime(currentTime.value?:0))
}
//原始代码
//转换中的协同路由
//val currentTimeTransformed=currentTime.switchMap{
//timeStampToTime是一个挂起函数,所以我们需要从一个协程调用它。
//liveData{emit(timeStampToTime(it))}
// }
private-suspend-fun-timestamp-totime(时间戳:长):字符串{
延时(500)//模拟长时间运行
val date=日期(时间戳)
返回日期.toString()
}
}
类DefaultDataSource(私有val-Iiodispatcher:CoroutineDispatcher):数据源{
重写getCurrentTime():LiveData=
实时数据{
while(true){
发射(System.currentTimeMillis())
延迟(1000)
}
}
...
}

它可以为空,因为有一个构造函数

LiveData()

创建未指定值的LiveData

和打电话

val data: LiveData<Long> = LiveData()
data.value
您可以
立即发出一个值,但如果您更改顺序

liveData {
    while (true) {
        delay(1000)
        emit(System.currentTimeMillis())
    }
}
然后在第一秒钟内没有发出值,调用
currentTime。value
将返回
null

(注意:是否有意在每次
currentTime
access上创建一个新的
LiveData

liveData {
    while (true) {
        delay(1000)
        emit(System.currentTimeMillis())
    }
}