我发现

val list: List<@Composable ()-> Unit> = listOf({Text("Cat")}, {Text("Dog")})

有效,但

val list: List<@Composable ()-> Unit> = listOf({Text("Cat")}) + listOf({Text("Dog")})

在第一个Text()上生成错误"@Composable次调用只能从@Composable个函数的上下文中发生".

为什么添加列表可以很好地处理诸如

val list: List<String> = listOf("Cat") + listOf("Dog")

但似乎对合成物不起作用?有没有办法将可组合元素的列表添加到彼此之间?

推荐答案

这两个场景之间的行为差异与Jetpack Compose处理@Composable个函数的方式以及调用它们的上下文有关.

在第一个场景中:

val list: List<@Composable ()-> Unit> = listOf({Text("Cat")}, {Text("Dog")})

这两个Text("Cat") and Text("Dog")都包装在列表中的@Composable lambda表达式中.当您直接使用该列表时,将在@Composable函数的上下文中调用lambda表达式.

在第二个场景中:

val list: List<@Composable ()-> Unit> = listOf({Text("Cat")}) + listOf({Text("Dog")})

在这里,您使用+运算符来连接两个列表.结果列表包含两个@Composable lambda表达式,但它们不会在@Composable上下文中自动调用.

为了更好地理解,请try 使用此示例

@Composable
fun MainView() {
    val list: List<@Composable () -> Unit> = combineComposableLists()

    // Important: Render each composable in the combined list
    list.forEach { composable -> composable() }
}

@Composable
fun combineComposableLists(): List<@Composable () -> Unit> {
    val list1: List<@Composable () -> Unit> = getList1()
    val list2: List<@Composable () -> Unit> = getList2()

    return list1 + list2
}

@Composable
fun getList1(): List<@Composable () -> Unit> {
    return listOf(
        { Text("Cat") },
        { Text("Dog") }
    )
}

@Composable
fun getList2(): List<@Composable () -> Unit> {
    return listOf(
        { Text("Fish") },
        { Text("Bird") }
    )
}

Android相关问答推荐

广播接收者意图从服务内设置,而不被其他服务接收

Android Compose Lazy柱形实时UI更改

在模块中找到重复的类com.google.Firebase.auth.ktx.AuthKt||Android Studio

保护所有程序包文件和类

如何将我的Android应用程序(Kotlin)中的图像分享给其他应用程序?

为什么我有多个Player实例?

如果我的圆形图像的顶部居中于卡片内部,我如何在其下方画一条弧线?

在Jetpack Compose中实现焦点突出的最佳方式?

插入视图模型时,dagger 未命中绑定错误

在更改MuableState的值后,Android API 26(Oreo)上的Composable不能重新组合

使用 Gadle kotlin 为多模块 Android 代码库设置 jacoco

Android 不在后台更新位置

Jetpack Compose 如何使一个项目相对于另一个项目垂直居中

java.lang.ExceptionInInitializerError -- 原因:java.lang.NullPointerException

如何在 BasicTextField 中全选焦点

如何在屏幕旋转或系统主题更改后将光标移动到 TextField 的末尾并保持键盘显示?

在 Kotlin 中打开新片段时如何对当前片段应用更改?

在android studio中使用wifi配对设备的问题

MVVM - 这个逻辑的最佳层是什么?

多个项目 react-native android 构建错误