应用导航:Navigation Compose 与 XML 遗留对照
文章目录
- 第 1 章 统一导航的价值
- 第 2 章 Navigation Compose 基础
- 第 3 章 返回栈与 NavOptions
- 第 4 章 XML Nav 遗留对照
- 踩坑
- 第 5 章 深链与 ViewModel 作用域
- 第 6 章 测试与反模式
- 第 7 章 治理清单
- 面试速查 · 追问链
- 追问链 #1:Navigation Compose vs XML? 🔥
- 追问链 #2:launchSingleTop 与 popUpTo? 🔥
- 追问链 #3:深链谁解析? ⭐
- 追问链 #4:多 BottomBar 栈? 💡
- 完整链路一句通
- 相关推荐
第 1 章 统一导航的价值
手动FragmentTransaction堆栈难测、深链难统一、返回键行为不一致。Navigation 组件把路由、参数、返回栈声明化。
| 场景 | 现代默认 | 遗留对照 |
|---|---|---|
| 新 Compose 功能 | Navigation Compose | — |
| 存量 XML 多 Fragment | 逐步迁移 | XML Nav Graph 维护 |
第 2 章 Navigation Compose 基础
@SerializabledataobjectHomeRoute@SerializabledataclassDetailRoute(valitemId:String)@ComposablefunAppNavHost(navController:NavHostController=rememberNavController()){NavHost(navController,startDestination=HomeRoute){composable<HomeRoute>{HomeScreen(onOpen={id->navController.navigate(DetailRoute(id))})}composable<DetailRoute>{entry->valroute=entry.toRoute<DetailRoute>()DetailScreen(itemId=route.itemId)}}}Kotlin 2.x + Navigation 2.8+ 序列化 Route 替代字符串拼参。
第 3 章 返回栈与 NavOptions
navController.navigate(DetailRoute(id)){launchSingleTop=truepopUpTo<HomeRoute>{saveState=true}restoreState=true}launchSingleTop:避免重复压入同一详情。popUpTo+saveState:BottomBar 多栈切换保留状态。
预测性返回:与NavController.popBackStack()配合;勿与手动FragmentTransaction混用。
第 4 章 XML Nav 遗留对照
XML 时代nav_graph.xml+findNavController().navigate(R.id.action_*)仍可能维护存量。新路由进 ComposeNavHost;混排时用单一NavController桥接,避免双栈。
踩坑
- 新功能仍手写
transaction.replace堆栈。 startActivity与 Nav 混用导致返回跳过中间页。
第 5 章 深链与 ViewModel 作用域
// AndroidManifest 示意<intent-filter><action android:name="android.intent.action.VIEW"/><dataandroid:scheme="myapp"android:host="item"/></intent-filter>navController.navigate(deepLinkUri)。ViewModel 用hiltViewModel()或navGraphViewModels绑定 NavBackStackEntry store(《ViewModel 与状态恢复》)。
Android 17:targetSdk 37后台经IntentSender启动 Activity 受后台启动(BAL)约束,深链入口宜在用户可见交互后触发。
第 6 章 测试与反模式
- 测试:
createAndroidComposeRule+ 测NavHost路由。 - 反模式:导航逻辑散落在 Composable 深处——路由表集中管理。
第 7 章 治理清单
| 检查项 | 通过标准 |
|---|---|
| 新 UI | Compose 用类型安全 Route |
| 返回 | 预测性返回走 NavController |
| 参数 | 无魔法字符串 Bundle 键(新代码) |
| 作用域 | 共享 VM 用 navGraphViewModels |
| 混排 | 单一 Nav 真相源 |
面试速查 · 追问链
追问链 #1:Navigation Compose vs XML? 🔥
参考回答:新 Compose 功能用 Compose Nav + 序列化 Route;XML 仅遗留维护。
追问链 #2:launchSingleTop 与 popUpTo? 🔥
参考回答:SingleTop 防重复实例;popUpTo 清栈到某目的地并可选 saveState。
追问链 #3:深链谁解析? ⭐
参考回答:NavController + Manifest intent-filter;参数进 Route 或 SavedStateHandle。
追问链 #4:多 BottomBar 栈? 💡
参考回答:嵌套navigation+ 各 tab 独立 startDestination + popUpTo 保存状态。
完整链路一句通
类型安全 Route→NavHost 注册 composable→navigate + NavOptions 管栈→ViewModel 绑 BackStackEntry→深链/BAL 合规入口。
相关推荐
Kotlin 作用域函数:let/apply 怎么选
Kotlin 语法与空安全:从零的第一课
