【问题标题】:How to combine multiple Modifier objects in Jetpack Compose?如何在 Jetpack Compose 中组合多个 Modifier 对象?
【发布时间】:2021-05-04 12:39:12
【问题描述】:

我有一个可组合对象,它将 Modifier 实例传递给其子可组合对象,如下所示:

@Composable
fun MyComposable(
    modifier: Modifier = Modifier,
    content: @Composable BoxScope.() -> Unit,
) {
    Box(
        modifier = modifier.fillMaxWidth(),
        content = content,
    )
}

这会将fillMaxWidth 修饰符添加到modifier 参数。但是,这不是所需的行为,因为我希望 fillMaxWidth 成为默认宽度,但仍允许调用者覆盖它。

如何在将本地修饰符设为默认值的同时合并/合并这两个修饰符?

【问题讨论】:

标签: android kotlin android-jetpack android-jetpack-compose


【解决方案1】:

您可以简单地使用Modifier.then(otherModifier)。 注意:顺序很重要,您可能需要考虑自己添加的内容以及从外部添加的内容。

composed 用于有状态修饰符,例如当您想要实现自定义触摸控件时,每次发生任何变化时都会调用您。 见Composed Docs

【讨论】:

    【解决方案2】:

    使用Modifier.composed 函数。

    @Composable
    fun MyComposable(
        modifier: Modifier = Modifier,
        content: @Composable BoxScope.() -> Unit,
    ) {
        OtherComposable(
            modifier = Modifier.fillMaxWidth().composed { modifier },
            content = content,
        )
    }
    

    【讨论】:

    • 这是修饰符的错误使用方式。正如@Aman kappor 提到的那样,为合并修饰符目的而组成,您可以轻松使用Modifier.then(otherModifier)。 Modifier.composed 声明了一个 Modifier 的即时组合,它将为它修改的每个元素组合。 compose 可用于实现有状态的修饰符,这些修饰符对每个被修改的元素都具有特定于实例的状态,从而允许将相同的修饰符实例安全地用于多个元素,同时保持元素特定
    【解决方案3】:

    使用Modifier.then 函数。

    @Composable
    fun MyComposable(
        modifier: Modifier = Modifier,
        content: @Composable BoxScope.() -> Unit,
    ) {
        OtherComposable(
            modifier = Modifier.fillMaxWidth().then(modifier),
            content = content,
        )
    }
    

    【讨论】:

    • 不,不正确。尝试使用例如:Modifier.fillMaxWidth().then(Modifier.width(100.dp))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多