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())
}
}