Использование Kotlin Sealed Classes для маршрутизации на разные экраны

Хорошая идея - создавать запечатанные классы как таковые:

sealed class Route<out T: Any> {
    data class ToRoute1<out T : Any>(val data: T) : Route<T>()
    data class ToRoute2<out T : Any>(val data: T) : Route<T>()
    data class ToRoute3<out T : Any>(val data: T) : Route<T>()
}

Таким образом, класс печати Route определит все возможные места назначения, к которым текущий экран может «направиться». Так, например, LoginScreen может иметь следующий закрытый класс:

sealed class LoginRoute<out T: Any> {
    data class ToSignUp<out T : Any>(val data: T) : LoginRoute<T>()
    data class ToUserDetails<out T : Any>(val data: T) : LoginRoute<T>()
    data class ToSomeOtherPossibleDestination<out T : Any>(val data: T) : LoginRoute<T>()
}

Теперь в ViewModel я могу иметь:

val proceedToDestination = MutableLiveData<Event<LoginRoute>>()

тогда в представлении я мог просто наблюдать proceedToDestination и делать следующее:

viewModel.proceedToDestination.observe(this, Observer { route ->
    route?.consume()?.run {
        when (route) {
            LoginRoute.ToSignUp -> // TODO START SIGNUP
            LoginRoute.ToUserDetails-> // TODO GO TO USER DETAILS SCREEN
            LoginRoute.ToSomeOtherPossibleDestination-> // TODO GO TO OTHER POSSIBLE DESTINATIONS
        }
    }
})

Мой вопрос в том, является ли это хорошей идеей или хорошей практикой в ​​целом? Заранее спасибо.

Редактировать:

Просто очень хочу оживить это снова и, возможно, найти ответы.


person Archie G. Quiñones    schedule 13.02.2019    source источник
comment
Умышленно ли не создавать подклассы запечатанного класса LoginRoute с ToSignUp и т. Д.?   -  person tynn    schedule 13.02.2019
comment
Я не уверен, понимаю ли я ваш вопрос или нет. Вы можете подробнее рассказать об этом?   -  person Archie G. Quiñones    schedule 13.02.2019
comment
@ ArchieG.Quiñones это работает? что такое событие?   -  person Jithish P N    schedule 11.11.2019


Ответы (1)


Насчет sealed class - это нормально. Я загрузил наш подход Simple-Router, который использует аналогичные маршруты. Вы также можете провести тест с довольно интересным маршрутизатором Kompass.

Помимо реализации, разница здесь в ответственности за маршрутизацию - в решениях, которые я представил, Presenter/ViewModel имеет доступ к Router и вызывает navigate(..) на нем - в вашем подходе вы используете Rx/LiveData и позволяете своему View обрабатывать это, но это просто еще один логический уровень над ним.

person Dev_IL    schedule 16.05.2019