Compose Navigation 时序图(点击 → 跳转 → 返回)
一、点击跳转(navigate)
┌──────────┐
│ User │
└────┬─────┘
│ 点击
▼
┌────────────────────┐
│ Composable(UI) │
│ onClick { │
│ navController │
│ .navigate(route) │
│ } │
└────┬───────────────┘
│
▼
┌────────────────────┐
│ NavController │
│────────────────────│
│ 1. 查 NavGraph │
│ 2. route 匹配 │
│ 3. 参数解析 │
└────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ NavBackStackEntry (NEW) │
│──────────────────────────────│
│ - route │
│ - arguments │
│ - SavedStateHandle │
│ - ViewModelStore │
└────┬─────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Composable Destination │
│ (DetailScreen) │
│ │
│ remember(...) │
│ viewModel() ← 绑定 Entry │
└──────────────────────────────┘
二、返回(popBackStack)
┌────────────────────┐
│ Composable(UI) │
│ navController │
│ .popBackStack() │
└────┬───────────────┘
│
▼
┌────────────────────┐
│ NavController │
│────────────────────│
│ 移除当前 Entry │
└────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ NavBackStackEntry (PREVIOUS) │
│──────────────────────────────│
│ - ViewModel 仍然存在 │
│ - State 仍然存在 │
└────┬─────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Composable 重组 │
│ UI 状态恢复 │
└──────────────────────────────┘
三、配置变化 / 进程被杀 & 恢复(必懂)
┌────────────────────┐
│ Process Kill / │
│ Configuration │
└────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ SavedStateRegistry │
│──────────────────────────────│
│ 保存 NavBackStackEntry │
│ 保存 route + arguments │
└────┬─────────────────────────┘
│
▼
┌────────────────────┐
│ 重建 NavHost │
│ 重建 NavGraph │
└────┬───────────────┘
│
▼
┌──────────────────────────────┐
│ 恢复 NavBackStackEntry │
│──────────────────────────────│
│ SavedStateHandle 注入 VM │
└────┬─────────────────────────┘
│
▼
┌──────────────────────────────┐
│ Composable 重组 │
│ UI 正常显示 │
└──────────────────────────────┘
四、这张图你一定要记住的 5 个点(重点)
1️⃣ ViewModel 绑定的是 NavBackStackEntry
❌ 不是 Composable
✅ 每一个 Entry = 一个 VM 作用域
2️⃣ navigate ≠ 调用页面
navigate 只是 创建一个新的 Entry
3️⃣ popBackStack ≠ 重建页面
是 恢复旧 Entry
4️⃣ State 会自动恢复,但事件不会
所以导航必须用 一次性事件
5️⃣ route 是唯一可恢复的导航信息
不要依赖全局变量 / 单例传参
五、一句话工程总结(你可以直接贴到笔记里)
navigate()
→ NavController
→ NavBackStackEntry
→ ViewModel / SavedStateHandle
→ Composable
搞清楚 Entry,一切导航问题都能解释清楚