Использование 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
справиться с этим, но это просто еще один логический слой над ним.