我们可以像这样在 Kotlin 中编写功能接口(interface) - function-interfaces
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 Composable 功能?下面的代码不起作用。 `
fun interface SampleText {
@Composable
fun text(data : String)
}
val textImpl = SampleText { data ->
return@SampleText @Composable { Text(data) }
}
@Composable
fun testText() = textImpl.text("Data")
我也试过了,但是还是不行。
fun interface SampleText {
fun text(data : String) : @Composable () -> Unit
}
val textImpl = SampleText { data ->
@Composable { Text(data) }
}
@Composable
fun testText() = textImpl.text("Data")
最佳答案
第一个版本没有以它的 lambda 形式编译,因为你的接口(interface)函数返回一个 Unit
而你实际上有一个 Type mismatch
错误,它只是奇怪的编译器当您尝试返回带注释的 @Composable
函数时报告 Internal Error
,但如果您只是返回类似 String
的内容,问题就会变得很清楚。
要解决您的第一个版本,要么像这样完全声明一个类的对象(尽管它没用,因为您首先想要的是 SAM 接口(interface)的 lambda 版本而不是实际对象)
val textImpl = object: SampleText {
@Composable
override fun text(data: String) {
Text(data)
}
}
,但它只需像这样调用 testText() 函数即可工作。
testText()
或者将其更改为您的第二个版本。
现在对于你的第二个版本,因为你的接口(interface)返回一个 @Composable
lambda,你必须在调用站点中调用它,进行两次函数调用以使其工作,
testText()() // two invocations
第一次调用调用您的 testText()
函数,第二对括号从您的界面调用 @Composable
lambda。
或者简单地调用.invoke()
testText().invoke() // just call the .invoke() of the returned composable lambda
任何一个实现和调用都显示文本“Data”
关于android - 如何使用 Kotlin 函数式 (SAM) 接口(interface)编写可组合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74532297/