如何创建可传递的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
相关产品推荐
相关产品推荐

