未解决的参考:等待。 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 协程的主要内容,如果未能解决你的问题,请参考以下文章