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

Jetpack Compose重组时机与非状态变量值丢失问题咨询

结论:你的推测完全正确

原因分析

  • Compose的Composable函数每次重组都会重新执行整个函数体,局部变量choiceChecked如果不用remember修饰,每次重组都会被重新初始化为null。
  • 选中项后的正常操作:点击选项时,checked.value改变会触发重组,此时choiceChecked被赋值为当前选中项的索引和checked状态。后续点击打印按钮时,如果没有其他状态变化触发重组,Composable不会重新执行,choiceChecked会保留之前的赋值结果,所以能打印正确值。
  • 熄屏亮屏场景:熄屏再亮屏会触发系统级的UI重绘,导致整个AlbumGrouping Composable重新执行,此时choiceChecked被重新初始化为null,所以值丢失。

修复方案

将choiceChecked改为用remember+mutableStateOf修饰,确保重组时保留状态:

var choiceChecked by remember { mutableStateOf<Pair<Int, MutableState<Boolean>>?>(null) }

额外优化建议

你当前的实现中,每个列表项的checked是独立的MutableState,虽然能实现单选,但可以简化逻辑:直接用remember保存选中的索引,而不是保存Pair<Int, MutableState<Boolean>>,这样状态管理更清晰。示例:

// 替换原来的choiceChecked定义
var selectedIndex by remember { mutableStateOf<Int?>(null) }

// 点击逻辑修改为
Box(
    modifier = Modifier.clickable {
        selectedIndex = if (selectedIndex == index) null else index
    }
) {
    // ...其他内容
    IconToggleButton(
        checked = selectedIndex == index,
        onCheckedChange = {
            selectedIndex = if (selectedIndex == index) null else index
        }
    ) {
        // ...图标内容
    }
}

// 打印时直接用selectedIndex
TextButton(onClick = {
    println("index${selectedIndex}")
})

这种方式不需要维护每个项的checked状态,直接通过选中索引来控制UI,逻辑更简洁,也避免了状态同步问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:29:52