Android Jetpack Compose使用mutableStateListOf修改元素未触发重组问题
问题原因
mutableStateListOf 仅能感知列表结构级别的变更(新增、删除、替换元素),无法感知列表内部存储的元素自身的属性修改。你当前直接修改列表中已有TravellersDetails实例的error字段的操作,没有触发列表本身的状态变更通知,因此Compose不会触发UI重组。
两种常用修复方案
- 方案1:将data类内部需要响应变更的字段声明为Compose State类型(性能最优,仅触发对应item重组)
把TravellersDetails中的error字段修改为:
此时字段自身的变更会被Compose直接感知,不需要修改列表就可以触发对应Item的UI更新。var error by mutableStateOf(false) - 方案2:更新时替换列表对应位置的元素(无需修改data类定义)
利用data类的copy方法生成新实例,再赋值给列表对应下标,触发列表的结构变更通知:fun update(index){ childTravellersList[index] = childTravellersList[index].copy(error = true) }
额外优化点
UI层的val list = remember{viewModel.childTravellersList}可以直接去掉,viewModel中的列表实例本身不会随UI重组销毁,直接在itemsIndexed中传入viewModel.childTravellersList即可。
内容的提问来源于stack exchange,提问作者imn
相关产品推荐
相关产品推荐

