在正确的方式中从悬浮的存储库中获取ViewModel中的LiveData的方式

问题描述 投票:0回答:1

[我把头围在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
}

如何正确执行此操作?

kotlin android-livedata kotlin-coroutines android-viewmodel
1个回答
0
投票

suspend fun getAll() : LiveData<List<Mountain>>中删除suspend关键字

Room中的LiveData已经是异步的,如果您正在使用Room来获取实时数据,它将在后台正常工作。

Room, Coroutines, LiveData

© www.soinside.com 2019 - 2024. All rights reserved.