也就是说,我正在构建一个自定义撰写布局并填充该列表,如下所示
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 开发人员团队那里了解正确的方法。这就是让我问是否有办法强制重组整个屏幕的原因。
你不能强制一个可组合函数进行重组,这都是由组合框架本身处理的,有一些优化来确定什么时候发生了会使可组合函数无效的更改并触发重组,只有那些受到影响的元素变化。
你的方法的问题是你没有使用不可变的类来表示你的状态。如果你的状态发生变化,而不是改变你的状态类中的一些深层变量,你应该创建你的状态类的一个新实例(使用 Kotin 的
data class
),那样(通过在自动生成的类中使用equals
) 可组合项将收到状态更改通知并触发重组。
Compose 在使用 UDF(单向数据流)和不可变类来表示状态时效果最佳。
这与使用视图系统中的
LiveData<List<Foo>>
并改变列表中的 Foo
没有什么不同,不会通知此 LiveData
的可观察对象,您必须分配一个新列表给LiveData
对象。同样的原则适用于组合状态。
您可以使用此重新创建整个作品:
val text = remember { mutableStateOf("foo") }
key(text.value) {
YourComposableFun(
onClick = {
text.value = "bar"
}
) {
}
}
在这个例子中,键是text.value,当它的值在onClick中改变时,键函数中的所有内容都将被重新组合。
叫这个
currentComposer.composition.recompose()