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

Unresolved reference: await. Kotlin coroutines

我正在尝试使用 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)
    }
}}

Api存储库(这里出现错误):

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

您应该将服务 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
}

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

interface GitHubApi {

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

}

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

class ApiRepository(private val api: GitHubApi) {

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

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

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

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