导航流程
介绍
Android Nav3 版本采用“统一服务入口 + 模块化路由注册”的流程。业务侧只调用导航 API,不直接管理回退栈。
运行流程
AppNavHost创建rememberNavBackStack(MainRoutes.Main)。AppNavHost通过rememberBackStackNavigationController创建控制器。AppNavHost在DisposableEffect中绑定AppNavigator与NavigationService。- 业务层调用
navigate(...)/navigateBack(...)/DemoNavigator.xxx()。 NavigationService委托给AppNavigator。AppNavigator在底层执行登录拦截后,再把命令交给NavigationController。NavigationController操作 Nav3 回退栈完成跳转、回退、带结果回退。
入口挂载位置
导航宿主位于: app/src/main/java/com/joker/kit/core/navigation/AppNavHost.kt
核心绑定逻辑:
kotlin
val backStack = rememberNavBackStack(MainRoutes.Main)
val navigationController = rememberBackStackNavigationController(backStack, navigator)
DisposableEffect(navigationController) {
navigator.attachController(navigationController)
NavigationService.bind(navigator)
onDispose {
NavigationService.unbind(navigator)
navigator.detachController(navigationController)
}
}说明:
attachController:让AppNavigator拿到当前活跃控制器。NavigationService.bind:让简写 API(navigate等)可直接使用。- 页面销毁时必须解绑,避免持有失效引用。
业务层触发跳转
方式一:模块 Navigator(推荐)
kotlin
DemoNavigator.toNetworkDemo()
DemoNavigator.toNavigationWithArgs(goodsId = 1001)
UserNavigator.toUserInfo()方式二:直接调用简写 API
kotlin
navigate(DemoRoutes.NetworkRequest)
navigateBack()
navigateBackTo(MainRoutes.Main)方式三:跳转并关闭当前页
kotlin
navigateAndCloseCurrent(
route = UserRoutes.Info,
currentRoute = AuthRoutes.Login,
)适用于登录成功后进入主页、提交成功后进入详情等场景。
动画与 Graph 组装
AppNavHost 统一维护前进/返回动画,并在 appEntryProvider 中按模块挂载:
mainGraph()demoGraph()authGraph()userGraph()
新增模块时只需追加对应 Graph,不需要改动业务页面跳转写法。
常见问题定位
- 跳转无效:检查
AppNavHost是否完成NavigationService.bind(navigator)。 - 页面未注册:检查模块
*Graph是否已加入appEntryProvider()。 - 参数异常:检查
entry<Routes.ParamRoute> { key -> ... }是否正确传递到 ViewModel。 - 返回异常:检查是否误用
navigateAndCloseCurrent或navigateWithPopUpTo。