是否可以将 Android 可组合项作为数组传递?

Is it possible to pass Android Composables as an array?

在下面的示例中,我可以将多个可组合项作为函数传递给列。是否有可能以任何其他方式传递它们?理想情况下,作为可组合项的数组。

class ComponentScreen : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContent {
        MyApplicationTheme {
            // A surface container using the 'background' color from the theme
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colors.background
            ) {
                Column(content = function())
            }
        }
    }
}

@Composable
private fun function(): @Composable() (ColumnScope.() -> Unit) {
    return {
        Greeting("Android")
        Greeting("Android2")
    }
}
}

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

例如,我可以传递类似...的内容吗?

@Composable
private fun function(): @Composable() (ColumnScope.() -> Unit) = arrayListOf(Greeting("Android"), Greeting("Android2"))

(在这种格式下它不会编译,因为它不是 ColumnScope.() -> Unit)

Return类型的Greeting("Android")Unit,所以你不能把它放在这样的数组中。

您可以像这样创建一个可组合项数组:

private fun function(): List<@Composable (ColumnScope.() -> Unit)> =
    listOf(
        { Greeting("Android") },
        { Greeting("Android2") }
    )

请注意,此函数不需要是可组合的。

您不能简单地将此函数的结果传递给 Column,但您可以通过以下方式展开它:

Column {
    function().forEach { view ->
        view()
    }
}

如果你打算密集使用它,你可以为这种情况创建一个包装器:

@Composable
fun Column(
    modifier: Modifier = Modifier,
    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
    horizontalAlignment: Alignment.Horizontal = Alignment.Start,
    views: List<@Composable (ColumnScope.() -> Unit)>,
) {
    Column(
        modifier = modifier,
        verticalArrangement = verticalArrangement,
        horizontalAlignment = horizontalAlignment,
    ) {
        views.forEach { view ->
            view()
        }
    }
}

然后你就可以轻松使用它了:

Column(views = function())