KoinとRetrofitでMVVMを使用しているAndroidアプリに取り組んでいます。
突然、次のようなエラーが表示され続けます
インターフェイスをインスタンス化できません!インターフェイス名: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()
}
}
そして最後に、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
、それだけです。
また、リポジトリの関数も一時停止可能である必要があり、ビューモデルはLiveDataを返す必要があり、そこでアクティビティ(またはフラグメント)がそれを監視します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加