ColumnScope 修饰符作为可组合的参数

时间:2021-04-22 07:37:30

标签: android android-jetpack-compose

我正在制作一个类似脚手架的可组合组件,其中包含可组合的文本。我希望脚手架具有文本的修饰符参数。我希望能够从 ColumnScope 传递修饰符,例如能够对齐文本。

这是脚手架的简化版本:

@Composable
fun MyScaffold(
    text: String,
    modifier: Modifier,
) {
    Text(
        modifier = modifier,
        text = text
    )
}

在调用 Scaffold 时,我想传递一个修饰符,以便文本水平对齐:

@Preview
@Composable
fun PreviewScaffold() {
    MyScaffold(
        text = "Hello",
        modifier = Modifier.align(Alignment.CenterHorizontally)
    )
}

但是这不会编译,因为 align() 方法是 ColumnScope 中的扩展函数,因此它仅在 ColumnsScope 内部时才有效。

如何将 ColumnScope 修饰符作为 MyScaffold 的参数传递?

请注意,另一种方法是在脚手架中传递可组合的整个文本,而不仅仅是一个字符串,但我宁愿只有一个字符串,以便我可以在脚手架内制作大部分样式,但只需给出外部调用者可以覆盖它。

谢谢!

1 个答案:

答案 0 :(得分:2)

使用 1.0.0(使用 1.0.0-beta07 测试),您可以使用所需的范围来确定可组合的范围:

@Composable
fun ColumnScope.MyScaffoldX(
    text: String,
    modifier: Modifier,
) {
    Text(
        modifier = modifier.align(Alignment.CenterHorizontally),
        text = text
    )
}

然后将其用于:

Column() {
    MyScaffoldX(text = "Hello")
}

否则,您可以在您的示例中使用 Modifier 参数:

@Composable
fun MyScaffold(
    text: String,
    modifier: Modifier,
) {
    Text(
        modifier = modifier,
        text = text
    )
}

使用它:

Column() {
    MyScaffold(
        text = "Hello",
        modifier = Modifier.align(Alignment.CenterHorizontally)
    )
}