android - 使用 Kotlin 密封类路由到不同的屏幕
问题描述
像这样创建密封类是个好主意:
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
}
}
})
我的问题是,这总体上是一个好主意还是一个好的做法?提前致谢。
编辑:
只是真的想让它再次活跃起来,也许能找到一些答案。
解决方案
关于sealed class
- 这很好。我上传了使用类似路由的Simple-Router方法。您还可以使用非常有趣的Kompass路由器进行基准测试。
除了实现之外,这里的区别在于路由责任 - 在我提出的解决方案Presenter/ViewModel
中可以访问Router
和调用navigate(..)
它 - 在您使用Rx/LiveData
并让您View
处理它的方法中,但这只是它之上的另一个逻辑层。
推荐阅读
- javascript - 循环类后从元素中检索元素CSS属性?
- c# - VSTO:自动更正添加条目未按预期工作
- ios - iOS 应用程序在更新到新版本和新的 firebasedb 后崩溃
- ios - 如何在 Swift 框架中使用 Obj-C 框架代码?
- performance - 如何正确部署kafka监控代理?
- jmeter - jmeter 报告详细信息问题:显示不正确的计数
- javascript - [已解决]如何取消“引导模式”退出行为?
- c# - 每次 3d 游戏套件项目启动时都会出现 14 个错误
- ios - Objective-C:如何将货币符号€转换为货币代码EUR并在标签上显示?
- java - Spring Boot webflux 上传文件内容类型异常