Запечатанный класс для связи Repository to ViewModel - PullRequest
2 голосов
/ 11 марта 2020

Основано на этой публикации Флорины Мунтенеску. У меня есть 2 вопроса:

Вопрос 1: В следующей ситуации, учитывая Respository ответ SomeApiResult :

sealed class SomeApiResult<out T : Any> {
    object Success : SomeApiResult<Unit>()
    object NoAccount : SomeApiResult<Unit>()
    sealed class Error(val exception: Exception) : SomeApiResult<Nothing>() {
        class Generic(exception: Exception) : Error(exception)
        class Error1(exception: Exception) : Error(exception)
        class Error2(exception: Exception) : Error(exception)
        class Error3(exception: Exception) : Error(exception)
    }
} 

Последнее при использовании when в моем ViewModel Я не смогу сделать что-то вроде:

when (result: SomeApiResult) {
    ...
    is SomeApiResult.Error.Error1,
    is SomeApiResult.Error.Error2 -> {
        // it will fail with "Unresolved reference: exception"
        result.exception
    }
    is SomeApiResult.Error.Error3 -> {
        ...
    }
}

Как мне решить эту проблему?
Это действительно так:

when (result: Result<Int>) {
   ...
   is SomeApiResult.Error -> result.exception.message
}

Вопрос 2: При создании ответа об ошибке мне нужно создать GenericError , потому что, если я пытаюсь создать экземпляр sealed class Я получаю ошибку. Вот как я заставляю его работать:

is Result.Error ->
    when (result.exception) {
        is Error1 -> SomeApiResult.Error.Error1(result.exception)
        is Error2 -> SomeApiResult.Error.Error2(result.exception)
        ...
        else -> SomeApiResult.Error.Generic(result.exception)
    }

В моем ViewModel я не буду запрашивать Error.Generic.
Вместо этого я буду использовать is SomeApiResult.Error, как показано выше (например, * 1034). * «другие ошибки»). Это правильный путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...