Почему getValue LiveData <Long>может иметь значение Nullable? - PullRequest
0 голосов
/ 06 апреля 2020

Код A основан на https://github.com/android/architecture-components-samples/blob/master/LiveDataSample/app/src/main/java/com/android/example/livedatabuilder/LiveDataViewModel.kt

Я изменил некоторый код.

Я думаю, что emit(timeStampToTime(currentTime.value)) будет правильным, но ошибка системного отчета, поэтому я должен использовать emit(timeStampToTime(currentTime.value?:0))

1: Мне очень странно, почему val currentTime isn ' t Nullable, а currentTime.value - Nullable.

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

1 Ответ

1 голос
/ 06 апреля 2020

Обнуляется, потому что есть конструктор

LiveData ()

Создает LiveData без назначенного ему значения.

и, например,

val data: LiveData<Long> = LiveData()
data.value

вернет null.

Или рассмотрит ваш код:

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

Вы emit значение сразу, но если вы измените порядок

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

, то в течение первой секунды значение не будет выдано, и вызов currentTime.value вернет null.

(Примечание. : намеренно ли вы создаете новый LiveData при каждом currentTime доступе?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...