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

