未解决的参考:等待。 Kotlin 协程

Posted

技术标签:

【中文标题】未解决的参考:等待。 Kotlin 协程【英文标题】:Unresolved reference: await. Kotlin coroutines 【发布时间】:2020-07-23 14:56:49 【问题描述】:

我正在尝试使用 Retrofit 2 和协程从 Api 获取数据。从我的 GetRepositoriesUseCase 我开始协程,但 'await()' 函数是一个未解决的引用。

视图模型:

fun getRepositoryList()  
    getRepositoriesUseCase(textLiveData.value.toString(), viewModelScope)  result ->
        result.onSuccess  repositoriesList.value = it 
        result.onFailure  show(it.message.toString()) 
    

GetRepositoriesUseCase:

class GetRepositoriesUseCase(private val repository: ApiRepository) 

operator fun invoke(
    key: String,
    coroutineScope: CoroutineScope,
    onResult: (Result<Collection<Repository>>) -> Unit
) 
    coroutineScope.launch 
        val result = withContext(Dispatchers.IO) 
            runCatching  repository.getRepositories(key) 
        
        onResult(result)
    

ApiRepository(这里出现错误):

class ApiRepository(private val api: GitHubApi) 

fun getRepositories(key: String): Collection<Repository> 
    return api.getRepository(key).await().list

API:

interface GitHubApi

@GET("search/repositories")
fun getRepository(@Query("q") query: String)

【问题讨论】:

【参考方案1】:

您没有在GitHubApi 中指定函数的返回类型。如果您想使用 Kotlin Coroutines,您还应该将此方法标记为 suspend。您的 api 接口应如下所示:

interface GitHubApi 

@GET("search/repositories")
suspend fun getRepository(@Query("q") query: String): Collection<Repository>


在存储库类中,您应该简单地将挂起函数传递给这样的用例:

class ApiRepository(private val api: GitHubApi) 

suspend fun getRepositories(key: String): Collection<Repository> 
    return api.getRepository(key)

这应该可以解决您的问题。

【讨论】:

【参考方案2】:

您应该将您的服务 API 定义为暂停。为此,请确保您使用改造 2.6.0 或更高版本,然后像这样定义您的服务 API

@GET("search/repositories")
suspend fun getRepository(@Query("q") query: String): <Return type here>

然后这样称呼它

suspend fun getRepositories(key: String): Collection<Repository> 
    return api.getRepository(key).list

【讨论】:

【参考方案3】:

我通过添加这个依赖解决了这个问题:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1'

【讨论】:

以上是关于未解决的参考:等待。 Kotlin 协程的主要内容,如果未能解决你的问题,请参考以下文章

来自阻塞代码的异步/等待 kotlin 协程

kotlin协程的生命周期与jetpack组件绑定

IntelliJ 中的 Kotlin 未解决的参考

Kotlin:未解决的参考软银机器人

Kotlin 中的 ViewModel:未解决的参考

Android Studio 3.1.3 - 未解决的参考:R - Kotlin