使用 Kotlin Sealed 类 路由到不同的屏幕
Using Kotlin Sealed Classes for routing to different screens
像这样创建密封的 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
seal class 将定义当前屏幕可以"route to" 所有可能的目的地。所以例如 "LoginScreen" 可以有以下密封 class:
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
}
}
})
我的问题是这总体上是一个好主意还是一个好的做法?提前致谢。
编辑:
只是真的想让它再次活跃起来,也许能找到一些答案。
关于 sealed class
- 这很好。我上传了我们的 Simple-Router approach which uses similar Routes. You can also benchmark with pretty interesting Kompass 路由器。
除了实施之外,这里的区别在于路由责任 - 在我提出的解决方案中 Presenter/ViewModel
可以访问 Router
并对其调用 navigate(..)
- 在你的方法中你使用 Rx/LiveData
并让您的 View
处理它,但这只是它上面的另一个逻辑层。
像这样创建密封的 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
seal class 将定义当前屏幕可以"route to" 所有可能的目的地。所以例如 "LoginScreen" 可以有以下密封 class:
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
}
}
})
我的问题是这总体上是一个好主意还是一个好的做法?提前致谢。
编辑:
只是真的想让它再次活跃起来,也许能找到一些答案。
关于 sealed class
- 这很好。我上传了我们的 Simple-Router approach which uses similar Routes. You can also benchmark with pretty interesting Kompass 路由器。
除了实施之外,这里的区别在于路由责任 - 在我提出的解决方案中 Presenter/ViewModel
可以访问 Router
并对其调用 navigate(..)
- 在你的方法中你使用 Rx/LiveData
并让您的 View
处理它,但这只是它上面的另一个逻辑层。