该条目出自 kotlin-footguns 技能集合,面向使用 Kotlin 与 Jetpack Compose 构建多形态导航界面的开发者,讨论“导航标签注册漂移”这一类问题。
用途:当应用需要同时支持紧凑窗口和宽窗口,并因此拥有底部栏、侧边栏、样式化胶囊栏等多个导航界面时,每个界面往往各自维护一份 listOfNotNull 标签列表。条目把这些列表之间的不同步归纳为可检查的陷阱,帮助开发者在新增或改动标签时避免漏改。
主要能力与覆盖的问题:
- 漏注册:标签已完整实现、路由可解析,但未被某个界面注册,因而在该界面完全不出现,且不报错。条目建议先枚举再修改,并强调要统计列表字面量数量,而不是文件数或界面数。
- 同一界面维护两份不同列表:样式化栏把“选中与路由”的完整列表和“胶囊绘制”的子集列表分开,只改其中一份会导致“能显示但点击无反应”或“可路由但从不显示”。
- 序号与位置混用:声明式 ordinal 是身份标识,而指示器组件需要的是列表中的位置。条目给出在组件边界处做双向转换的写法,并提醒
selected == index这类比较只在两套编号恰好重合时才成立。 - 条件标签的兜底:功能开关关闭后,需要同时在每个界面修正高亮选中项,并在宿主处把仍停留在该页面的用户导航走,二者缺一不可。
- 尺寸与图结构:按标签数量自适应宽度的栏在标签增多时可能溢出;标签目标若未在导航图中注册 composable,编译通过但点击失败。
- 状态入口漂移:多个顶栏共享的状态入口图标、点击与徽标需要收敛为一个共享 composable,徽标点需要页面底色圆环才能在各种图标上可见。
使用方式:条目以说明和代码片段为主,并给出四条 grep 校验命令,分别用于查找涉及标签类型的文件、某个目标在路由/图/声明/各界面映射中的出现位置、混用两套编号的比较,以及顶栏状态入口是否都指向同一共享 composable。随后建议实际启动窄窗口与宽窗口、跨断点调整大小,并在条件标签页面上关闭对应功能进行验证。
适用场景:多形态 Android/Compose 应用的导航栏开发与代码审查,尤其是频繁增删标签、存在功能开关标签的项目。
限制:内容为经验性说明,未提供独立安装命令、版本要求、性能数据或自动化工具;所列校验命令需开发者自行在代码库中运行并人工判读。