Неразрешенная ссылка: жду. Kotlin сопрограмм - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь получить данные от Api, используя Retrofit 2 и сопрограммы. Из моего GetRepositoriesUseCase я запускаю сопрограмму, но функция 'await ()' является неразрешенной ссылкой.

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 (здесь I получить ошибку):

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Вы не указали тип возврата функции в GitHubApi. Если вы хотите использовать сопрограммы Kotlin, вы также должны пометить этот метод как 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)
}}

Это должно решить вашу проблему.

0 голосов
/ 10 апреля 2020

Вы должны определить свои сервисные 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
}
...