如何在Jetpack Compose的LazyColumn中正确递增变量
问题分析与解决方案
核心问题
你当前的写法存在两个关键问题:
- 在
LazyColumn的items代码块中直接修改mutableState变量(curDay++)会触发Composable重组,导致代码反复执行,既会引发无限循环风险,也会让curDay的数值完全混乱。 - 用可变状态逐个递增加天数的思路本身不合理——硬编码的任务列表,每个任务的天数应该和它在列表中的位置绑定,而非依赖一个可变状态来计数。
修复方案
直接使用itemsIndexed替代items,利用列表项的索引生成天数(索引从0开始,加1即可得到从1开始的天数),完全不需要维护curDay这个可变状态:
@Composable fun _30DaysApp() { Scaffold(topBar = { }) { padding -> LazyColumn(contentPadding = padding) { // 使用itemsIndexed获取每个任务的索引 itemsIndexed(tasks) { index, task -> // 索引+1就是当前任务对应的天数 CardTask(task = task, day = index + 1) } } } } @Composable fun CardTask(task: Task, day: Int, modifier: Modifier = Modifier) { var expand by remember { mutableStateOf(false) } Card(shape = RoundedCornerShape(16.dp)) { Column( modifier = modifier .padding(12.dp) ) { Row { Text(text = stringResource(R.string.day, day)) Spacer(modifier = modifier.weight(1f)) ExpandButton(expanded = expand, onClick = { expand = !expand }) } Text(text = stringResource(task.articleRes)) Spacer(modifier = Modifier.size(8.dp)) Image( painter = painterResource(task.imageRes), contentDescription = null, contentScale = ContentScale.Fit ) } } }
为什么这样能解决问题
itemsIndexed会为每个列表项提供对应的索引值,每个任务的天数和它在硬编码列表中的位置一一对应,逻辑清晰且不会出错。- 去掉了可变状态
curDay,避免了状态修改触发的不必要重组,从根源上解决了数值混乱和循环重组的问题。
内容的提问来源于stack exchange,提问作者Pavlo
相关产品推荐
相关产品推荐

