在使用自定义可组合项中的修饰符参数之前,我尝试添加一些条件逻辑。如何才能做到这一点?例如
@Composable
fun MyComposable(index: Int, myModifier: Modifier = Modifier) {
if (index == 0) {
myModifier.background(Color.Red)
} else {
myModifier.background(Color.Blue)
}
Column(modifier = myModifier) {
...
}
Compose 只是忽略对 myModifier
所做的更改
现在,我正在创建一个 Modifier 类型的新变量并使用它,但我想知道是否有更好的方法使用原始传入的修饰符。
最佳答案
Compose simply ignores changes made to myModifier
它不会忽略,但是当您链接修饰符时,如果修饰符的任何部分发生更改,您就会创建新的修饰符实例。
当它们读取的变量发生变化时,修饰符也会被重组,在您的实例中,当 Modifier.background()
发生变化时,会使用未更改的修饰符的一部分创建一个新的修饰符,在下面的示例是尺寸和新的背景修改器。
您需要将这个新的修饰符分配给您的可组合项
@Composable
private fun ModifierRecompositionSample() {
var counter by remember { mutableStateOf(0) }
Column {
val myModifier = Modifier.fillMaxWidth()
Text(text = "MyModifier: $myModifier", modifier = myModifier)
val newModifier = if (counter == 0) {
myModifier.background(Color.Red)
} else {
myModifier.background(Color.Blue)
}
Text(text = "MyModifier: $myModifier", modifier = myModifier)
Text(
color = Color.White,
text = "newModifier: ${newModifier.hashCode()}, newModifier: $newModifier",
modifier = newModifier
)
Button(onClick = { counter++ }) {
Text("Counter: $counter")
}
}
}
如果您想研究组合阶段和修饰符重组,可以查看此问题
关于android - 如何在使用之前更改传入的修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74167039/