Kotlin Интерфейс не может быть создан! Имя интерфейса: kotlinx.coroutines. Отложено - PullRequest
0 голосов
/ 29 марта 2020

Я работаю над Android приложением, которое использует MVVM с Koin и Retrofit.

Внезапно я получаю сообщение об ошибке, говорящее

Интерфейс не может быть создан! Имя интерфейса: kotlinx.coroutines.Deferred

, однако я не могу найти, в чем проблема.

Текущая структура такова.

ViewModel.

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

и, наконец, раздел, где я вызываю мою модель представления.

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

Я не могу найти, какая часть интерфейса имеет проблему ...

1 Ответ

1 голос
/ 29 марта 2020

Retrofit уже обрабатывает функции приостановки, поэтому вам не нужно возвращать Deferred. Просто верните RootExchangeRate и все.

Кроме того, функция вашего репозитория также должна быть приостановленной, а модель представления должна возвращать LiveData, где активность (или фрагмент) будет наблюдать ее.

...