Jetpack Compose导航传参异常:传递ID与接收值不符求助
问题分析
你遇到的问题是导航传参时,发送方打印的category.id为2,但接收方拿到的却是0,这大概率是参数解析类型不匹配导致的:
手动拼接查询参数时,参数是以字符串形式传递的,但接收时直接用getInt()获取,若未在导航图中显式定义参数类型,系统无法自动将字符串转为整数,会返回默认值0。
解决方案
方案1:手动转换参数类型
在接收方先获取字符串参数,再转为整数:
composable(NavGraph.FoodProducts) { backStackEntry -> val categoryIdStr = backStackEntry.arguments?.getString("categoryId") val categoryId = categoryIdStr?.toInt() ?: 2 Log.d("Navigation", "Received Category ID: $categoryId") FoodProductsScreen(navController, categoryId) }
方案2:在导航图中定义参数类型(推荐)
在nav_graph.xml的目标页面节点中添加参数定义,指定类型为整数:
<composable android:id="@+id/foodProductsScreen" android:name="com.yourpackage.FoodProductsScreen"> <argument android:name="categoryId" app:argType="integer" /> </composable>
之后就可以正常用getInt()获取参数,无需手动转换。
方案3:使用Safe Args(官方推荐,避免拼接错误)
- 先在app模块的
build.gradle中添加依赖:
plugins { id("androidx.navigation.safeargs.kotlin") }
- 在导航图中定义参数(同方案2),同步项目后会自动生成方向类
- 发送方跳转时使用生成的方法:
.clickable { Log.d("Navigation", "Category ID: ${category.id}") navController.navigate(NavGraphDirections.actionToFoodProductsScreen(category.id)) }
- 接收方通过生成的Args类获取参数:
composable(NavGraph.FoodProducts) { backStackEntry -> val args = FoodProductsScreenArgs.fromBackStackEntry(backStackEntry) val categoryId = args.categoryId Log.d("Navigation", "Received Category ID: $categoryId") FoodProductsScreen(navController, categoryId) }
额外检查点
- 确认
NavGraph.FoodProducts的路由字符串没有拼写错误,拼接后的完整路由可通过日志打印验证:val route = "${NavGraph.FoodProducts}?categoryId=${category.id}" Log.d("Navigation", "Navigating to route: $route") navController.navigate(route) - 检查
FoodProductsScreen中的过滤逻辑:products.filter { it.id == categoryId }是否正确——如果it.id是产品ID,应该改为it.categoryId == categoryId,否则会导致无产品显示。
内容的提问来源于stack exchange,提问作者Tevel
相关产品推荐
相关产品推荐

