创建这样的密封类是否是一个好主意:
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 :(得分:0)
关于sealed class
-很好。我上传了使用类似路线的Simple-Router方法。您还可以使用非常有趣的Kompass路由器进行基准测试。
除了实现之外,这里的区别在于路由责任-在我介绍的解决方案Presenter/ViewModel
中可以访问Router
并对其调用navigate(..)
-在您使用的方法中,您使用{{1} },让您的Rx/LiveData
处理它,但这只是它上面的另一个逻辑层。