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
相关产品推荐
相关产品推荐

