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对象分配一个新列表。同样的原则也适用于组合状态。
| 归档时间: |
|
| 查看次数: |
27222 次 |
| 最近记录: |