android mutableStateOf()未分配新对象?

ocebsuys  于 2022-11-20  发布在  Android
关注(0)|答案(1)|浏览(144)

我通过修改旧的mutableStateOf()对象数据来修改它,但新数据没有反映在它上面。

变量:作为

val offTime = mutableStateOf<List<OffTime>>(emptyList())

更新代码

fun updateOffTime(newOffTime: OffTime, index: Int){
        val updatedOffTime = offTime.value.mapIndexed { i, offTime ->
            var result = offTime
            if(index == i) result = newOffTime
            result
        }
        offTime.value = updatedOffTime
        Log.d(TAG, "updateOffTime: $updatedOffTime")
        Log.d(TAG, "updateOffTime: ${offTime.value}")
    }

Note:当对象OffTime没有id时,即OffTime(fromTime, toTime):-工作
关闭时间(id,从时间,到时间):-不起作用

jgwigjjp

jgwigjjp1#

我不知道您的具体用例,也不知道您的整个代码实现,但是如果我可以问一下,为什么您使用普通的collectionlist,而不是SnapshotStateList或其新示例的扩展mutableStateListOf,当它是执行列表操作的一部分时?
您是否尝试过将offtime转换为SnapshotStateList

val offTime = mutableStateListOf<OffTime>(mutableStateListOf())

并执行更新?

offTime.add( ... )
//or
offtime.remove(...)
//or
offTime[index] = offtime copy
//or
var offTimeIterator = offTime.lisIterator() // where you can safely modify indeces

SnapshotStateList是在compose中为这样的use-cases创建的,在compose中您可以执行普通的列表操作,如(添加、删除、更新或批更新),并保证re-composition
你的电话

offTime.value = updatedOffTime // if this is a new instance of a list

将触发整个重组,因为整个列表引用已经被改变,但是对于SnapshotStateList,对结构的任何改变都保证匹配特定的re-composition,比如说,如果你修改索引7处的项,并且如果这被比如LazyColumn观察到,则只有第7个索引LazyColumn'sre-compose
另外,我不知道你的Offtimedata class还是标准类,我建议它是data-class,这样你就可以轻松地对它的某个示例进行copy(),将一个新值传递给它的某个属性,并在SnapshotStateList中重新赋值。

相关问题