未解决的参考:等待。 Kotlin 协程
Unresolved reference: await. Kotlin coroutines
我正在尝试使用 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)
}
}}
Api存储库(这里出现错误):
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)
}
您应该将服务 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
}
您没有在 GitHubApi
中指定 return 类型的函数。如果您想使用 Kotlin Coroutines,您还应该将此方法标记为 suspend
。您的 api 界面应该如下所示:
interface GitHubApi {
@GET("search/repositories")
suspend fun getRepository(@Query("q") query: String): Collection<Repository>
}
在存储库 class 中,您应该简单地将一个挂起函数传递给这样的用例:
class ApiRepository(private val api: GitHubApi) {
suspend fun getRepositories(key: String): Collection<Repository> {
return api.getRepository(key)
}}
这应该可以解决您的问题。
我通过添加这个依赖解决了这个问题:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1'
我正在尝试使用 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)
}
}}
Api存储库(这里出现错误):
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)
}
您应该将服务 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
}
您没有在 GitHubApi
中指定 return 类型的函数。如果您想使用 Kotlin Coroutines,您还应该将此方法标记为 suspend
。您的 api 界面应该如下所示:
interface GitHubApi {
@GET("search/repositories")
suspend fun getRepository(@Query("q") query: String): Collection<Repository>
}
在存储库 class 中,您应该简单地将一个挂起函数传递给这样的用例:
class ApiRepository(private val api: GitHubApi) {
suspend fun getRepositories(key: String): Collection<Repository> {
return api.getRepository(key)
}}
这应该可以解决您的问题。
我通过添加这个依赖解决了这个问题:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1'