我正在尝试使用Retrofit 2和协程从Api获取数据。从我的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(在这里我得到错误):
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)
}
您没有在中指定函数的返回类型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)
}}
这应该可以解决您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句