AndroidX Navigation Compose嵌套图类型安全传参问题
问题场景与代码示例
导航图实现
NavHost(navController, startDestination = Splash) { composable<Splash> { SplashScreen(navController) } navigation<Home>(startDestination = Editor) { composable<Editor> { navBackStackEntry-> val data= navBackStackEntry.toRoute<Home>() // 此方式会导致应用崩溃 val path = navBackStackEntry.arguments?.getString("path") // 临时解决方案可行 .... } }
序列化路由定义
@Serializable object Splash @Serializable data class Home(val path: String) @Serializable object Editor
问题描述
通过navController.navigate(route = Home("my path"))从Splash页面导航到Home嵌套图时,无法在Editor可组合项中通过navBackStackEntry.toRoute<Home>()获取path参数。原因是Editor并非嵌套图的初始目标页(初始目标是Home),当前Editor的返回栈条目不包含Home的路由参数,尽管参数已存在于Bundle中。目前通过navBackStackEntry.arguments?.getString("path")可以获取参数,但需要更健壮的类型安全方案。
类型安全解决方案
要获取嵌套图根路由(Home)的参数,需要获取嵌套图的返回栈条目,而非当前Editor目的地的条目:
composable<Editor> { val homeBackStackEntry = navController.getBackStackEntry<Home>() val homeData = homeBackStackEntry.toRoute<Home>() // 直接使用homeData.path即可,类型安全且不会崩溃 }
原理说明
嵌套图的路由参数会绑定到嵌套图的根返回栈条目(即Home对应的条目),而非子目的地(Editor)的条目。通过navController.getBackStackEntry<Home>()可以精准获取到存储参数的那个栈条目,再调用toRoute<Home>()就能安全地反序列化出类型化的参数对象,避免了直接操作Bundle的非类型安全问题。
内容的提问来源于stack exchange,提问作者Xenione
相关产品推荐
相关产品推荐

