android - 如何在使用之前更改传入的修饰符?

标签 android android-jetpack-compose android-jetpack

在使用自定义可组合项中的修饰符参数之前,我尝试添加一些条件逻辑。如何才能做到这一点?例如

@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() 发生变化时,会使用未更改的修饰符的一部分创建一个新的修饰符,在下面的示例是尺寸和新的背景修改器。

您需要将这个新的修饰符分配给您的可组合项

enter image description here

@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")
        }
    }
}

如果您想研究组合阶段和修饰符重组,可以查看此问题

How I can display data for specific item

关于android - 如何在使用之前更改传入的修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74167039/

相关文章:

java - 使用 SharedPreferences 保存切换开关/复选框状态

android - fragment 错误: incompatible types, 需要android.app.fragment 但找到activity.messagefragment

Android 在 RelativeLayout 的顶部和中心对齐图像

android - VerticalArrangement = Arrangement.Bottom 列不起作用

android - 更改安卓 :windowBackground in Jetpack Compose

android - Jetpack Compose 状态提升、预览和 ViewModels 最佳实践

android - 使用导航组件导航到首选项 fragment

任务终止后,Android workmanager 计划的工作人员丢失

android - 使用 Intent 通过 Android jetpack 导航图传递数据

java - 如何在消息收件箱图标上显示未读短信的数量