You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可传递的Composable Lambda?解决调用上下文报错

解决Composable Lambda的上下文报错问题

你遇到的错误是因为定义的lambda是普通的() -> Unit类型,没有Composable上下文,而Button这类Composable函数只能在带有@Composable注解的上下文中调用。要创建可传递的Composable Lambda,必须给lambda的类型加上@Composable注解,让它具备Composable上下文。

正确写法示例

方式1:显式指定lambda的Composable类型

@Composable
private fun SomeComposable() {
    // 明确指定lambda类型为@Composable () -> Unit
    val composableLambda: @Composable () -> Unit = {
        Button(onClick = {}) {
            Text("hello")
        }
    }
    
    // 将这个lambda传递给其他自定义组件
    MyCustomContainer(content = composableLambda)
}

// 接收Composable lambda的自定义组件示例
@Composable
fun MyCustomContainer(content: @Composable () -> Unit) {
    // 在Composable上下文中调用传入的lambda
    content()
}

方式2:直接给lambda添加@Composable注解(Kotlin 1.6+支持)

@Composable
private fun SomeComposable() {
    // 直接在lambda前标注@Composable,编译器会自动推导正确类型
    val composableLambda = @Composable {
        Button(onClick = {}) {
            Text("hello")
        }
    }
}

带参数的Composable Lambda

如果需要传递带参数的Composable逻辑,同样要给lambda类型加上@Composable注解:

@Composable
private fun SomeComposable() {
    // 带String参数的Composable lambda
    val composableWithParam: @Composable (String) -> Unit = { text ->
        Button(onClick = {}) {
            Text(text)
        }
    }
    
    // 调用时传入参数
    composableWithParam("带参数的按钮")
}

核心要点:只有带有@Composable注解的lambda类型,才拥有调用其他Composable函数的上下文,不管是定义还是传递这类lambda,都要确保类型注解的正确性。

内容的提问来源于stack exchange,提问作者me.at.coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:10:00