导航概览
相关依赖
- Navigation Compose:https://developer.android.com/jetpack/androidx/releases/navigation
- Kotlinx Serialization(用于类型安全路由):https://github.com/Kotlin/kotlinx.serialization
app/src/main/java/com/joker/kit/navigation 提供整套类型安全导航方案:AppNavigator 负责分发导航事件,AppNavHost 负责接管 NavController 并执行动画,NavigationResultKey/RouteInterceptor 等工具保证路由传参、登录拦截、结果回传的统一体验。所有 Feature 层的 ViewModel 只需继承 BaseViewModel 系列,就能无缝接入这套机制。
模块组成
| 文件/目录 | 职责 |
|---|---|
AppNavigator.kt | 维护 MutableSharedFlow<NavigationEvent>,暴露 navigateTo、navigateBack、popBackStackWithResult、navigateBackTo 等 API。 |
AppNavHost.kt | 创建 NavController、监听导航事件并执行动画,挂载各 Feature 的 mainGraph / authGraph / userGraph。 |
NavigationEvent.kt | 定义事件模型(推新页、回退、带结果回退、回退到某页)。 |
NavigationResultKey.kt、RefreshResultKey.kt | 类型安全的结果回传工具,默认提供刷新 Key。 |
RouteInterceptor.kt | 维护“需要登录的路由”列表,BaseViewModel 在跳转前统一检查。 |
routes/* | 使用 @Serializable 定义的路由对象,是所有跳转与 NavGraph 注册的基础。 |
事件流
- ViewModel 继承
BaseViewModel,调用navigate(route)等方法。 BaseViewModel将请求交给AppNavigator,并在内部套上登录拦截。AppNavigator把操作包装成NavigationEvent推送到SharedFlow。AppNavHostcollectLatest事件并调用NavController.handleNavigationEvent()执行跳转、动画、或结果回传。- 需要监听刷新或复杂结果时,使用
NavigationResultKey在SavedStateHandle上读写强类型数据。
延伸阅读
为了方便检索,导航子主题拆分为以下文档:
- 路由配置:如何定义/注册路由,以及结合 NavGraph 的最佳实践。
- 导航流程:事件驱动架构的完整时序(ViewModel → Navigator → NavHost)。
- 登录与路由拦截:登录拦截、页面 Guard 的配置方式。
- 结果回传与通信:类型安全结果、刷新信号、跨页面通信。
阅读顺序可从概览开始,再按需求深入到具体章节。这样既能快速了解整体结构,又能在需要时针对性查阅。