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

Jetpack Compose删除mutableStateListOf项后被删TextField值传递给下方控件问题

问题原因分析

这个现象不是Jetpack Compose的故障,是Lazy列表重组时的状态匹配逻辑导致的。
你当前使用itemsIndexed渲染列表时,没有为每个条目指定唯一稳定的key,Compose默认会用条目的下标index作为重组时的匹配标识。当你删除前序条目后,后续所有条目的index都会整体前移1位,而你用rememberSaveable保存的TextField输入状态是和index绑定的,就会出现状态错位:被删除条目绑定的状态会被匹配到下移后的下一个条目上,也就是你看到的「被删除项的数值传递给下方TextField」的现象。

修复方案

1. 为列表条目指定唯一key

确保你的ShoppingCart类有全局唯一的标识字段(比如productId),修改itemsIndexed的调用,传入key参数用商品唯一标识作为匹配key:

itemsIndexed(
    items = ids,
    key = { _, item -> item.productId } // 必须用item本身的唯一稳定属性,不能用index
) { index, item ->
    // 原有条目渲染逻辑
}

2. 绑定输入状态到商品本身而非下标

修改rememberSaveable的调用,传入商品唯一标识作为状态的依赖key,确保只有商品本身变化时才重新初始化输入值:

var quantidades by rememberSaveable(
    key1 = item.productId,
    stateSaver = TextFieldValue.Saver
) {
    mutableStateOf(TextFieldValue(item.product_quant.toString()))
}

3. 可选优化:状态存储逻辑调整

你当前在onCreate中反复赋值ids的写法存在隐患,类成员变量和remember托管的状态混用容易出现状态同步问题,建议将整个ids列表的状态完全交给Compose托管:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val i = intent.getParcelableArrayListExtra<ShoppingCart>("produtos")!!
    setContent{
        val ids = remember {
            i.toMutableSet().toMutableStateList()
        }
        MainContent(ids) // 将ids作为参数传给MainContent
    }
}
问题复现参考

问题复现截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:15:03