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