Search code examples
androidkotlinretrofitkotlin-coroutinescoroutinescope

Unresolved reference: await. Kotlin coroutines


I'm trying to get data from Api using Retrofit 2 and coroutines. From my GetRepositoriesUseCase I start coroutine but 'await()' function is an unresolved reference.

ViewModel:

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 (here I get error):

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

Solution

  • You didn't specify a return type of a function in GitHubApi. If you want to use a Kotlin Coroutines you should also mark this method as suspend. Your api interface should be like below:

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

    In repository class you should simply pass a suspend function to a use case like this:

    class ApiRepository(private val api: GitHubApi) {
    
    suspend fun getRepositories(key: String): Collection<Repository> {
        return api.getRepository(key)
    }}
    

    This should solve your problem.