繁体   English   中英

使用Kotlin密封类路由到不同的屏幕

[英]Using Kotlin Sealed Classes for routing to different screens

创建这样的密封类是一个好主意:

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 -很好。 我上传了我们的使用简单路由简单路由器方法。 您还可以使用非常有趣的Kompass路由器进行基准测试。

除了实现之外,这里的区别在于路由责任-在我介绍的Presenter/ViewModel解决方案中可以访问Router并对其调用调用navigate(..) -在您的方法中,您使用Rx/LiveData并让您的View处理它,但这仅仅是它上面的另一个逻辑层。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM