Я хочу закончить этот год с пониманием того, что не было ясно для моих частей этого года.
Мы используем подклассы запечатанных классов для обратной связи от нашей ViewModel к пользовательскому интерфейсу.
Итак, мы начнем с чего-то вроде:
sealed class LoginRoute {
object LoginSuccessful : LoginRoute()
object LoginFailed : LoginRoute()
data class LoginError(val error: Throwable) : LoginRoute()
}
В нашей ViewModel у нас есть несколько потоков rxJava2, например:
override val loginServiceStatusStream: Observable<LoginRoute> =
loginServiceStatus
.map { status ->
if (status == Status.OK) {
LoginSuccessful
} else {
LoginFailed
}
}
.onErrorReturn {
LoginError(it)
}
То, что мы на самом деле испытываем: вышепоказано, что Observable не компилируется, потому что, как только onErrorReturn
добавлено, мы должны вручную добавить приведение к LoginRoute для каждого сопоставленного возвращаемого значения.
Как:
override val loginServiceStatusStream: Observable<LoginRoute> =
loginServiceStatus
.map { status ->
if (status == Status.OK) {
LoginSuccessful as LoginRoute
} else {
LoginFailed as LoginRoute
}
}
.onErrorReturn {
LoginError(it)
}
Если мы просто сделаем это так ( без onErrorReturn
), все будет работать без дополнительного оператора cast :
override val loginServiceStatusStream: Observable<LoginRoute> =
loginServiceStatus
.map { status ->
if (status == Status.OK) {
LoginSuccessful
} else {
LoginFailed
}
}
Мне бы очень хотелось понять, почему этот состав необходим.
Любая помощь приветствуется.
Спасибо, счастливого Рождества и счастливого нового года :) 1031 *