gpt4 book ai didi

android - Kotlin接口(interface)无法实例化!接口(interface)名称 : kotlinx. 协程.Deferred

转载 作者:行者123 更新时间:2023-12-03 10:56:10 25 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,该应用程序将 MVVM 与 Koin 和 Retrofit 结合使用。

突然间我不断收到错误消息

Interface can't be instantiated! Interface name: kotlinx.coroutines.Deferred

但是我找不到问题出在哪里。

当前的结构是这样的。

View 模型。

class ExchangeRateBanksViewModel (private val comercialBanksRepository: ComercialBanksRepository): ViewModel() , KoinComponent{

private val _uiState = MutableLiveData<CredentialsDataState>()
val uiState: LiveData<CredentialsDataState> get() = _uiState

init {
viewModelScope.launch {
runCatching {
emitUiState(showProgress = true)
comercialBanksRepository.getExchangeRateByToday()
}.onSuccess {root ->
val nameMap: MutableList<ExchangeRate> = root.data.map { it }.toMutableList()
emitUiState(result = Event(nameMap))
}.onFailure {
println(it.printStackTrace())
}
}
}

private fun emitUiState(showProgress: Boolean = false, result: Event<List<ExchangeRate>>? = null, error: Event<Int>? = null){
val dataState = CredentialsDataState(showProgress, result, error)
_uiState.value = dataState
}

data class CredentialsDataState(val showProgress: Boolean, val result: Event<List<ExchangeRate>>?, val error: Event<Int>?)
}

界面

interface ComercialBanksInterface {
@GET("api/commercialBankExchangeRates/date/today")
suspend fun requestExchangeRateToday(): Deferred<RootExchangeRate>
}

存储库。

interface ComercialBanksRepository {
suspend fun getExchangeRateByToday(): RootExchangeRate
}

class ComercialBanksRepositoryImplement(val comercialBanksService: ComercialBanksInterface): ComercialBanksRepository{
override suspend fun getExchangeRateByToday(): RootExchangeRate {
return comercialBanksService.requestExchangeRateToday().await()
}
}

最后是我调用 viewModel 的部分。

exchangeRateBanksViewModel.uiState.observe(this, Observer {
val dataState = it ?: return@Observer
if (!dataState.showProgress) displayHideSkeleton(hide = true) else displayHideSkeleton(hide = false)
if (dataState.result != null && !dataState.result.consumed){
dataState.result.consume()?.let { result ->
println("RESULT: ${result}")
exchangeRateAdapter.submitList(result)
}
}
if (dataState.error != null && !dataState.error.consumed){
dataState.error.consume()?.let { error ->
Toast.makeText(applicationContext, resources.getString(error), Toast.LENGTH_LONG).show()
}
}
})

我找不到界面的哪个部分有问题...

最佳答案

Retrofit 已处理挂起函数,因此您无需返回 Deferred。只需返回 RootExchangeRate 即可。

此外,您的存储库的功能也应该是可挂起的,并且 View 模型应该返回一个 LiveData,其中 Activity (或 fragment )将观察它。

关于android - Kotlin接口(interface)无法实例化!接口(interface)名称 : kotlinx. 协程.Deferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60917917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com