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