Android Compose 导航与返回栈管理
Android Compose 导航与返回栈管理
摘要:声明式界面中的导航需要同时管理页面参数、返回栈、状态恢复和生命周期。本文介绍 Compose 导航图的组织方式,以及如何避免页面之间相互耦合。
一、把导航图作为应用结构
导航图描述页面节点和允许的跳转。页面只暴露用户动作,例如打开订单详情,不应了解目标页面的内部实现。路由可以由常量或类型集中定义,避免字符串散落在界面各处。
页面跳转应由用户事件触发,不要放在每次重组都会执行的代码中。若跳转前需要业务操作,先完成验证,再根据明确结果导航。
二、传递标识而不是完整对象
页面间只传递稳定、精简的业务标识。目标页根据标识从仓库读取详情,避免参数过大、对象过期或进程重建后无法恢复。缺少参数或数据已删除时,应展示可恢复的状态,而不是崩溃。
对可选值、数字和枚举需要定义解析失败时的行为。路由参数不是权限凭证;目标页面仍需检查当前用户是否有权查看数据。
三、设计返回栈行为
普通跳转会把目标页放入返回栈,系统返回键则弹出顶部页面。提交完成、登录成功等流程有时需要移除旧页面,防止用户返回到已提交的表单。是否保留页面应依据用户流程决定。
不要在所有跳转时清空返回栈,否则系统返回键会失去预期。连续点击也可能重复打开相同页面,应通过禁用重复操作或明确的复用策略处理。
四、保存页面状态
短暂的界面状态可以由组合状态保存;需要跨配置变化保存的小值可使用可恢复状态;业务数据则应由 ViewModel 和仓库管理。大型列表、图片对象和数据库实体不适合放进状态保存包,应通过标识重新加载。
筛选条件、选中标签等小型状态适合恢复。保存后仍要确认其对应的数据是否已变化,避免恢复一个无效选择。
五、让导航与业务逻辑分开
ViewModel 不必持有导航控制器。界面可以把业务结果转换为导航动作,或由页面宿主消费一次性效果。这样业务逻辑可以在普通单元测试中验证。
一次性效果需要考虑配置变化和重复订阅,避免屏幕旋转后再次打开同一个页面。也可以将流程表达为持久状态,让界面根据状态决定显示内容。
六、检查主要流程
- 使用系统返回键走完正常、取消和完成路径。
- 旋转设备或模拟进程恢复,检查页面和关键状态。
- 快速重复点击跳转按钮,确认不会生成重复页面。
- 验证参数缺失、数据删除和权限失效时的反馈。
- 从通知等外部入口打开页面,确认前置状态不被假设存在。
七、总结
可靠导航需要清楚的路由边界、精简的参数、可解释的返回栈和合适的状态所有者。让跳转由明确事件驱动,并为异常入口设计恢复路径,可以降低页面之间的耦合。
- 点赞
- 收藏
- 关注作者
评论(0)