如何强制jetpack compose重组?

Rob*_*tec 25 android android-layout android-studio 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)})
   }
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,并且每当调用 onChange lambda 函数时屏幕都会重新组合,但是当涉及任何项目属性的任何微小更改时,它不会重新组合,详细说明让我们更改上面的 lambda 函数以执行以下操作

{index1,index2 -> list[index1].propertyName = true} 
Run Code Online (Sandbox Code Playgroud)

让 lambda 更改列表项的属性不会触发屏幕重组。我不知道这是否是 jetpack compose 中的一个错误,或者我只是采用了错误的方法来解决这个问题,我想从 Android 开发团队那里知道正确的方法。这就是让我问是否有办法强制重组整个屏幕的原因。

小智 27

您可以使用以下命令重新创建整个合成:

val text = remember { mutableStateOf("foo") }

key(text.value) {
    YourComposableFun(
        onClick = {
            text.value = "bar"
        }
    ) {

    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,键是text.value,当 onClick 中更改其值时,键函数内的所有内容都将被重新组合。


Fra*_*esc 16

您不能强制可组合函数重新组合,这一切都由组合框架本身处理,有优化来确定何时发生某些变化,从而使可组合函数无效并触发重组,仅对那些受组合函数影响的元素进行重组。改变。

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

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

LiveData<List<Foo>>这与使用视图系统中的 a 并改变Foo列表中的 s没有什么不同,可观察到的结果LiveData不会被通知,您必须为该LiveData对象分配一个新列表。同样的原则也适用于组合状态。