关于Jetpack Compose中NavController返回栈始终至少包含2个条目的疑问
嗨,我来帮你把这个问题掰扯明白~
你遇到的这个情况其实是Jetpack Navigation组件的内部实现逻辑导致的,不是系统bug,也不是不稳定的偶然现象:当你用rememberNavController()初始化导航控制器时,它的返回栈会默认把起始目的地的导航条目添加两次——一次是作为“初始导航状态”的占位记录,另一次是实际进入起始页面时的有效条目。这就是为啥你刚进入首页时,backStack.size已经是2了。
那为啥判断backStack.size > 2能正常工作呢?因为当你从首页跳转到其他页面时,返回栈会新增一个条目,size变成3;当你从其他页面返回首页,返回栈会移除那个新增的条目,回到2的状态。所以这个判断刚好能区分“是否在起始页”,但用固定数字2确实不够直观,而且如果未来Navigation组件的内部实现有调整,这个判断可能就失效了,确实不是最优解。
给你推荐两种更可靠、更符合官方设计思路的做法:
方法一:直接判断当前目的地是否为起始页
先获取导航图的起始目的地ID,再对比当前目的地:
val navGraph = navController.graph val startDestinationId = navGraph.startDestinationId val currentDestination by navController.currentDestinationAsState() if (currentDestination?.id != startDestinationId) { // 这里显示返回按钮 }
方法二:通过previousBackStackEntry判断
如果存在上一个返回栈条目,说明当前页面不是起始页:
val hasPreviousPage = navController.previousBackStackEntry != null if (hasPreviousPage) { // 这里显示返回按钮 }
这两种方法都是基于Navigation组件提供的公开API,不依赖内部的返回栈size逻辑,稳定性和可读性都更强,完全不用担心版本更新带来的问题~
备注:内容来源于stack exchange,提问作者Malachi Holden
相关产品推荐
相关产品推荐

