【问题标题】:Unresolved reference: await. Kotlin coroutines未解决的参考:等待。 Kotlin 协程
【发布时间】: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)
}

【问题讨论】:

    标签: android kotlin retrofit kotlin-coroutines coroutinescope


    【解决方案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'
        

        【讨论】:

          猜你喜欢
          • 2022-06-18
          • 1970-01-01
          • 2021-03-27
          • 2021-12-16
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-22
          相关资源
          最近更新 更多