首页 > 解决方案 > 使用 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
        }
    }
})

我的问题是,这总体上是一个好主意还是一个好的做法?提前致谢。

编辑:

只是真的想让它再次活跃起来,也许能找到一些答案。

标签: androidkotlinandroid-mvvmsealed-class

解决方案


关于sealed class- 这很好。我上传了使用类似路由的Simple-Router方法。您还可以使用非常有趣的Kompass路由器进行基准测试。

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


推荐阅读