Skip to content

导航流程

介绍

Android Nav3 版本采用“统一服务入口 + 模块化路由注册”的流程。业务侧只调用导航 API,不直接管理回退栈。

运行流程

  1. AppNavHost 创建 rememberNavBackStack(MainRoutes.Main)
  2. AppNavHost 通过 rememberBackStackNavigationController 创建控制器。
  3. AppNavHostDisposableEffect 中绑定 AppNavigatorNavigationService
  4. 业务层调用 navigate(...) / navigateBack(...) / DemoNavigator.xxx()
  5. NavigationService 委托给 AppNavigator
  6. AppNavigator 在底层执行登录拦截后,再把命令交给 NavigationController
  7. 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。
  • 返回异常:检查是否误用 navigateAndCloseCurrentnavigateWithPopUpTo