Использование 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
        }
    }
})

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

0 ответов

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

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

Другие вопросы по тегам