Navigation
应用导航 · androidx.navigation
Navigation 2 还是 Navigation 32.10.0-beta01
按成熟度、所有权和布局需求选择,而不是按数字大小替换。
最后更新 2026-08-01
对比
| 判断点 | Navigation 2 | Navigation 3 |
|---|---|---|
| 当前源码版本 | 2.10.0-beta01 | 1.2.0-alpha07 |
| 栈所有权 | NavController 内部管理 | 应用直接持有 NavBackStack |
| 内容映射 | graph/destination | key → NavEntry |
| 多 pane | 通过自适应导航等上层组合 | Scene/strategy 是核心扩展点 |
| 现有生态 | Fragment、Compose、Safe Args、UI 集成完整 | Compose-first,API 仍在 alpha 演进 |
选择建议
| 场景 | 选择 |
|---|---|
| 已有稳定 Nav2 应用 | 继续用 Nav2——不要仅因版本号重写 |
| 新 Compose 应用、传统栈式导航 | Nav2(成熟稳定) |
| 需要直接控制 back stack | Nav3(backStack.add/removeAt) |
| 多 pane / 大屏自适应布局 | 评估 Nav3(scene strategy 是扩展点) |
| 需要 Fragment / Safe Args | Nav2(生态完整) |
迁移原则
- 单个 feature 的导航状态只有一个 owner——要么 NavController,要么 NavBackStack,不要混。
- 在边界通过回调交接:子页面不直接操作父的栈,用
onBack/onNavigate回调。 - 不要让两套框架互相镜像每一步 back stack——那会让状态失去单一事实源。
什么时候该用 Nav3
- 底部导航 + 每 tab 独立栈(backStack 是普通 list,天然适合 tab 切换)
- 多窗口/大屏:同一导航状态渲染成不同布局
- 自定义过渡/动画策略(NavDisplay 的显示策略是扩展点)
常见陷阱
- 为版本号重写:已有稳定 Nav2 应用不要仅因版本号迁移。
- 两套框架互相镜像:不要让 NavController 和 NavBackStack 同步每一步——状态失去单一事实源。
- 子页面直接操作父栈:用
onBack/onNavigate回调交接,不直接操作父的 back stack。 - alpha 当生产:Nav3 1.2.0-alpha07,API 仍在演进,评估后再采用。
要点
- Nav2 成熟稳定、生态完整;Nav3 灵活但 alpha。
- 已有应用不必为版本号重写;新项目按需求评估。
- 单一导航 owner + 回调交接是迁移正确姿势。