如何强制喷气背包组合重新组合?

时间:2021-04-05 09:40:49

标签: android android-studio android-layout android-jetpack-compose

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

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 开发人员团队那里知道正确的方法。这就是让我问是否有办法强制重组整个屏幕的原因。

1 个答案:

答案 0 :(得分:2)

你不能强制一个可组合的函数重新组合,这一切都由组合框架本身处理,有一些优化来确定什么时候发生了一些会使组合无效的事情并触发重新组合,只有那些元素是受变化影响。

您的方法的问题在于您没有使用不可变的类来表示您的状态。如果您的状态发生变化,而不是改变状态类中的某些深层变量,您应该创建状态类的新实例(使用 Kotin 的 data class),这样(通过使用 equals自动生成的类)组合将收到状态更改的通知并触发重新组合。

当您使用 UDF(单向数据流)和不可变类来表示状态时,Compose 效果最佳。

这与使用视图系统中的 LiveData<List<Foo>> 并改变列表中的 Foo 没有什么不同,此 LiveData 的 observable 不会收到通知,您必须为 LiveData 对象分配一个新列表。同样的原则也适用于撰写状态。