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

如何实现Jetpack Compose导航参数传递?实践遇阻求助

Jetpack Compose导航参数传递问题解决步骤

1. 更新路由定义,添加参数占位符

先在目标页面的路由配置中加入参数占位,明确要传递的字段:

object HomeInfoDestination : KetoDestination{
    override val route = "homeInfo"
    // 生成带ID参数的完整路由
    fun createRoute(itemId: Int) = "$route/$itemId"
    // 定义参数键名,用于后续读取
    const val HOME_INFO_ID_KEY = "homeInfoId"
}

2. 修改NavHost配置,接收并解析参数

在导航宿主中配置目标页面的参数规则,同时从导航栈中读取参数并匹配对应数据:

NavHost(
    navController = navController,
    startDestination = Home.route,
    modifier = modifier
) {
    composable(route = Home.route) {
        HomeScreen(
            onHomeCardClick = { homeInfo ->
                navController.navigate(HomeInfoDestination.createRoute(homeInfo.id))
            }
        )
    }
    composable(
        route = "${HomeInfoDestination.route}/{${HomeInfoDestination.HOME_INFO_ID_KEY}}",
        arguments = listOf(
            navArgument(HomeInfoDestination.HOME_INFO_ID_KEY) {
                type = NavType.IntType
            }
        )
    ) { backStackEntry ->
        // 读取传递的ID参数
        val itemId = backStackEntry.arguments?.getInt(HomeInfoDestination.HOME_INFO_ID_KEY) ?: -1
        // 根据ID从数据模型中匹配对应条目
        val homeInfo = HomeInfoModel.homeInfoModelList.find { it.id == itemId }
        // 传递数据到目标页面,处理空值情况
        homeInfo?.let {
            HomeInfoScreen(homeInfo = it)
        } ?: run {
            Text(text = "未找到对应信息")
        }
    }
}

3. 调整目标页面,接收并使用参数

更新目标页面的组件,让它接收HomeInfo参数并传递给详情组件:

@Composable
fun HomeInfoScreen(homeInfo: HomeInfo){
    WelcomeText()
    HomeInfoDetails(homeInfo = homeInfo)
}

4. 修改源页面,实现带参数的导航逻辑

更新源页面的回调参数,让它能传递具体的HomeInfo数据,触发导航时携带ID:

@Composable
fun HomeScreen(onHomeCardClick: (HomeInfo) -> Unit) {
    HomeContentScreen(onHomeCardClick = onHomeCardClick)
}

@Composable
fun HomeContentScreen(
    modifier: Modifier = Modifier,
    onHomeCardClick: (HomeInfo) -> Unit
) {
    Column(
        modifier
            .verticalScroll(rememberScrollState())
            .padding(vertical = 16.dp)) {
        HomeQuote()
        // 遍历数据模型生成卡片,点击时传递对应数据
        HomeInfoModel.homeInfoModelList.forEach { item ->
            Card(
                modifier = Modifier
                    .padding(10.dp)
                    .clickable { onHomeCardClick(item) }
            ) {
                Text(text = item.title)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Edwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:25:25