android 修饰符与.apply一起使用时不起作用

pieyvz9o  于 2023-03-16  发布在  Android
关注(0)|答案(2)|浏览(171)

为什么border修饰符在与.apply { }一起使用时不应用?

val selected = remember { mutableStateOf(true) }

val selectableModifier = Modifier
    .padding(horizontal = 5.dp, vertical = 8.dp)
    .apply {
    // this changes, but border is not applied
    println("$selected changed") 
    if (selected) {
        border(
            BorderStroke(1.dp, MaterialTheme.colors.primaryVariant),
            RoundedCornerShape(13.dp)
        )
    }
}
7fhtutme

7fhtutme1#

apply总是返回this到输出。你可以在里面改变this,但是如果修改器是不可变的,你期望基于当前的修改器创建一个新的修改器。这就是为什么你的border被忽略了。
相反,您可以使用run,并且必须返回一些内容:新创建的修饰符或this。查看更多关于kotlin scope functions的信息。

val selected by remember { mutableStateOf(true) }

val selectableModifier = Modifier
    .padding(horizontal = 5.dp, vertical = 8.dp)
    .run {
        if (selected) {
            border(
                BorderStroke(1.dp, MaterialTheme.colors.primaryVariant),
                RoundedCornerShape(13.dp)
            )
        } else {
            this
        }
    }
ia2d9nvy

ia2d9nvy2#

当你调用一个修饰符的方法时,它会返回修饰符本身以及新的修改。所以你必须做一些类似的事情

var modifier = Modifier
modifier = modifier.doSomeThing()
modifier = modifier.doOtherThing()

或使用

val modifier = Modifier
.then(Modifier.doSomeThing())
.then(Modifier.doOtherThing())

您可以使条件然后扩展方法。

fun Modifier.thenIf(condition: Boolean, other: Modifier): Modifier =
    if (condition) this.then(other) else this

像这样使用它

val modifier = Modifier
.then(Modifier.doSomeThing())
.then(Modifier.doOtherThing())
.thenIf(canClick==true,Modifier.doConditionalThing())

相关问题