Skip to content

登录与路由拦截

介绍

导航拦截用于统一处理“需要登录”的页面,避免在业务代码重复写登录判断。

当前实现放在: app/src/main/java/com/joker/kit/core/navigation/RouteInterceptor.kt

受保护路由配置

通过路由类型集合声明受保护页面:

kotlin
private val loginRequiredRouteTypes: Set<KClass<out NavKey>> = setOf(
    UserRoutes.Info::class
)

只要把目标路由类型加入集合,导航层就会自动拦截。

拦截触发时机

拦截不在 ViewModel 层做,而是在底层导航入口统一处理:

  • 业务层调用 navigate(...)
  • NavigationService 委托到 AppNavigator.navigateTo(...)
  • AppNavigator.resolveTargetRoute(...) 判断是否需要登录。
  • 若未登录且目标受保护,则改为跳到 AuthRoutes.Login

核心逻辑:

kotlin
private fun resolveTargetRoute(route: NavKey): NavKey {
    return if (routeInterceptor.requiresLogin(route) && !userState.isLoggedIn.value) {
        routeInterceptor.getLoginRoute()
    } else {
        route
    }
}

这样可以保证不管是模块 Navigator 还是简写 API,都不会绕过拦截。

登录页配置

默认登录页通过 getLoginRoute() 返回:

kotlin
fun getLoginRoute(): NavKey = AuthRoutes.Login

如果登录页路由变更,只需改这一处。

常见调整

  • 新增受保护页面:把对应路由类加入 loginRequiredRouteTypes
  • 取消受保护页面:从集合中移除该路由类。
  • 登录页切换:修改 getLoginRoute() 返回值。
  • 增加复杂权限(如会员页):在拦截器中扩展策略,继续由 AppNavigator 统一调用。

小结

路由拦截的关键是“在最底层统一做判断”。业务侧只管调用导航方法,登录状态控制交给导航模块集中处理。