You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(官方推荐,避免拼接错误)

  1. 先在app模块的build.gradle中添加依赖:
plugins {
    id("androidx.navigation.safeargs.kotlin")
}
  1. 在导航图中定义参数(同方案2),同步项目后会自动生成方向类
  2. 发送方跳转时使用生成的方法:
.clickable {
    Log.d("Navigation", "Category ID: ${category.id}")
    navController.navigate(NavGraphDirections.actionToFoodProductsScreen(category.id))
}
  1. 接收方通过生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:23:23