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

Jetpack Compose导航至Album/{index}时index恒为0问题求助

导航时Index值传递异常(Jetpack Compose)

问题描述

在Jetpack Compose应用中,从列表导航至Album/{index}路由时,出现index值传递异常的问题。

预期行为

导航至Album/{index}路由时,index值应正确传递,列表每个项对应自身index,导航时需打印正确的index日志。

代码实现

@Composable
fun nav()
{
    lateinit var obj: playerviewmodel
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = "list")
    {
        composable(route = "Album/{index}")
        {
            backStackEntry ->
            val index = backStackEntry.arguments?.getInt("index") ?:0

            Log.d("ViewModel", "dummy: $index")
            obj = viewModel(factory = factory(index))
            val stateview = (obj as? playerviewmodel)?.ret()
            Space(img = img, index = index, text = text1, sub = text2, stateview = obj)
        }
        composable(route = "list")
        {
            view(nav = navController, image = img, text = text1, sub = text2)
        }
    }
}
@Composable
fun Listitem(
    img: Array<Int>,
    title: Array<String>,
    sub: Array<String>,
    nav: NavController,
    index: Int
)
{
    var objects by Delegates.notNull<Int>()
    Card(modifier = Modifier.clickable {
        nav.navigate("Album/$index")
        Log.d("list", "index: $index")
    }) {
        Row(verticalAlignment = Alignment.CenterVertically) {
            Image(painter = painterResource(id = img[index]), contentDescription = "", modifier = Modifier
                .padding(8.dp)
                .weight(.2f)
                .size(68.dp))
            Column(modifier = Modifier.weight(.8f)) {
                Text(text = title[index], style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold, modifier = Modifier.padding(8.dp))
                Text(text = sub[index], fontWeight = FontWeight.Thin, style = MaterialTheme.typography.labelMedium, modifier = Modifier.padding(start = 8.dp))
            }
        }
    }
}

@Composable
fun view(
    nav: NavController,
    image: Array<Int>,
    text: Array<String>,
    sub: Array<String>
)
{
    LazyColumn(content = {
        val itemcount = image.size
        items(itemcount){
              Listitem(img = image, title = text, sub = sub, nav = nav, index = it)
        }
    })
}

已尝试方案

添加日志追踪index值,点击列表项时index正确,但导航至目标路由后,index重置为0。

补充上下文

使用Jetpack Compose构建UI,通过NavController处理导航。点击列表项日志显示index正确,但目标路由始终获取到0。


问题分析

问题根源在于路由参数类型未显式声明:Jetpack Navigation默认会将路由中的参数识别为String类型,而你在获取参数时使用getInt("index"),因类型不匹配返回null,最终触发默认值0。

修复方案

在定义Album/{index}路由时,显式声明参数index的类型为Int:

@Composable
fun nav() {
    lateinit var obj: playerviewmodel
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = "list") {
        // 显式指定index参数为Int类型
        composable(
            route = "Album/{index}",
            arguments = listOf(
                navArgument("index") {
                    type = NavType.IntType
                }
            )
        ) { backStackEntry ->
            val index = backStackEntry.arguments?.getInt("index") ?: 0
            Log.d("ViewModel", "dummy: $index")
            obj = viewModel(factory = factory(index))
            val stateview = (obj as? playerviewmodel)?.ret()
            Space(img = img, index = index, text = text1, sub = text2, stateview = obj)
        }
        composable(route = "list") {
            view(nav = navController, image = img, text = text1, sub = text2)
        }
    }
}

额外优化建议

  • 避免在Composable顶层使用lateinit var obj: playerviewmodel,可将ViewModel的创建逻辑封装在Album路由的Composable内部,防止重组引发异常。
  • 导航时的参数传递逻辑无需修改,nav.navigate("Album/$index")会自动将Int类型的index转为字符串拼接进路由,配合声明的IntType参数类型,导航组件会自动解析为Int值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:52:06