[我把头围在Kotlin协程和LiveData上。我想做一个非常基本的用例,其中ViewModel返回取自Repository暂停函数的LiveData,该函数也返回LiveData。
存储库功能签名:
suspend fun getAll() : LiveData<List<Mountain>>
不能简单地做到这一点:
fun getMountains() : LiveData<List<Mountain>> {
return mountainsRepository.getAll()
}
因为编译器指出应该从协程或其他暂停函数调用暂停函数。我想出了两种丑陋的解决方案,但我知道它们并不优雅:
1 runBlocking解决方案
fun getMountains() : LiveData<List<Mountain>> = runBlocking { mountainsRepository.getAll() }
2具有可为空的LiveData的解决方案
fun getMountains() : LiveData<List<Mountain>>?{
var mountains : LiveData<List<Mountain>>? = null
viewModelScope.launch{
mountains = mountainsRepository.getAll()
}
return mountains
}
如何正确执行此操作?
从suspend fun getAll() : LiveData<List<Mountain>>
中删除suspend关键字
Room中的LiveData已经是异步的,如果您正在使用Room来获取实时数据,它将在后台正常工作。