如何使用Kotlin函数式(SAM)接口编写Jetpack Composable函数?
在Jetpack Compose中使用Kotlin函数式接口
我们可以用Kotlin函数式接口实现普通函数,比如:
fun interface Sum { fun add(a: Int, b: Int): Int } val sumImpl = Sum { a, b -> return@Sum a + b } val testSum = sumImpl.add(4, 5)
但要在Jetpack Compose中用同样方式实现,需要注意Composable注解的处理,你之前的两种写法都有问题,以下是正确的实现方式:
方式一:接口方法直接标记为@Composable
这种方式下,函数式接口的方法本身是Composable函数,实现lambda时直接编写Composable内容即可:
fun interface SampleText { @Composable fun text(data: String) } // 正确实现:lambda内直接写Composable代码,无需返回lambda val textImpl = SampleText { data -> Text(data) } @Composable fun testText() = textImpl.text("Data")
你之前的错误在于,在lambda里返回了一个@Composable {}块,但接口定义的是直接执行的Composable函数,lambda的内容就是函数体,直接写Text(data)即可,不需要额外包裹或返回。
方式二:接口方法返回Composable函数类型
如果要让接口方法返回@Composable ()->Unit类型,调用时需要执行返回的函数:
fun interface SampleText { fun text(data: String): @Composable () -> Unit } val textImpl = SampleText { data -> @Composable { Text(data) } } @Composable fun testText() { // 执行返回的Composable函数,两种写法都可以 textImpl.text("Data").invoke() // 或者简写为:textImpl.text("Data")() }
这种写法中,text方法返回的是一个Composable函数实例,而不是直接执行它,所以在testText里需要主动调用这个函数才能渲染UI。
内容的提问来源于stack exchange,提问作者virat
相关产品推荐
相关产品推荐

