【问题标题】:Kotlin Interface can't be instantiated! Interface name: kotlinx.coroutines.DeferredKotlin 接口无法实例化!接口名称:kotlinx.coroutines.Deferred
【发布时间】:2020-07-10 01:49:45
【问题描述】:

我正在开发一个使用带有 Koin 和 Retrofit 的 MVVM 的 Android 应用程序。

我突然收到一个错误提示

接口无法实例化!接口名称: kotlinx.coroutines.Deferred

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

目前的结构是这样的。

视图模型。

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

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

【问题讨论】:

    标签: android kotlin mvvm kotlin-coroutines


    【解决方案1】:

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

    您的存储库的功能也应该是可暂停的,并且视图模型应该返回一个 LiveData,活动(或片段)将在其中观察它。

    【讨论】:

    • 问题已解决。你是对的......我不知道改造已经处理了等待的jajaja。我删除了那部分代码,现在它可以工作了。谢谢好先生。
    • 别担心,伙计。很高兴我能提供帮助
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2014-03-12
    • 1970-01-01
    • 2021-12-21
    • 2018-05-13
    • 2023-02-09
    • 2023-03-08
    • 2014-07-27
    相关资源
    最近更新 更多