gpt4 book ai didi

android - 如何强制jetpack compose重组?

转载 作者:行者123 更新时间:2023-12-04 12:15:49 40 4
gpt4 key购买 nike

这么说,我正在构建一个自定义撰写布局并填充该列表,如下所示

val list = remember { dataList.toMutableStateList()}
MyCustomLayout{

list.forEach { item ->
key(item){
listItemCompose( data = item,
onChange = { index1,index2 -> Collections.swap(list, index1,index2)})
}
}
这段代码工作正常,每当调用 onChange lambda 函数时屏幕都会重新组合,但是当涉及到任何项目属性的任何微小变化时,它不会重新组合,详细说明让我们更改上述 lambda 函数以执行以下操作
{index1,index2 -> list[index1].propertyName = true} 
让 lambda 更改列表项的属性不会触发屏幕重新组合。我不知道这是否是 jetpack compose 中的错误,或者我只是采用了错误的方法来解决这个问题,我想知道 Android 开发人员团队的正确方法。这就是让我问是否有办法强制重组整个屏幕的原因。

最佳答案

您不能强制可组合函数重新组合,这一切都由 compose 框架本身处理,有一些优化可以确定何时发生某些更改,这会使可组合函数无效并触发重新组合,只有那些受改变。
您的方法的问题是您没有使用不可变类来表示您的状态。如果你的状态发生变化,你应该创建一个新的状态类实例(使用 Kotin 的 data class ),而不是改变你的状态类中的一些深层变量,这样(通过在自动生成的类中使用 equals ) 可组合对象将收到状态更改通知并触发重组。
当您使用 UDF(单向数据流)和不可变类来表示状态时,Compose 效果最好。
这与使用 LiveData<List<Foo>> 没有什么不同。从 View 系统和变异 Foo s 在列表中,这个 LiveData 的可观察值不会收到通知,您必须将新列表分配给 LiveData目的。同样的原则也适用于组合状态。

关于android - 如何强制jetpack compose重组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66950978/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com