登录与路由拦截
介绍
导航拦截用于统一处理“需要登录”的页面,避免在业务代码重复写登录判断。
当前实现放在: 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统一调用。
小结
路由拦截的关键是“在最底层统一做判断”。业务侧只管调用导航方法,登录状态控制交给导航模块集中处理。