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

如何在Jetpack Compose的LazyColumn中正确递增变量

问题分析与解决方案

核心问题

你当前的写法存在两个关键问题:

  1. 在LazyColumn的items代码块中直接修改mutableState变量(curDay++)会触发Composable重组,导致代码反复执行,既会引发无限循环风险,也会让curDay的数值完全混乱。
  2. 用可变状态逐个递增加天数的思路本身不合理——硬编码的任务列表,每个任务的天数应该和它在列表中的位置绑定,而非依赖一个可变状态来计数。

修复方案

直接使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:03:36