android - 如何使用 Kotlin 函数式 (SAM) 接口(interface)编写可组合函数

标签 android kotlin functional-programming android-jetpack-compose functional-interface

我们可以像这样在 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 的内容,问题就会变得很清楚。

enter image description here 对比 enter image description here

要解决您的第一个版本,要么像这样完全声明一个类的对象(尽管它没用,因为您首先想要的是 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”

enter image description here

关于android - 如何使用 Kotlin 函数式 (SAM) 接口(interface)编写可组合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74532297/

相关文章:

java - 倒计时器的 EditText 值

java - 我的 Android 模拟器显示模拟器错误

Android Kotlin Retrofit,等待暂停外的响应

r - 将函数列表应用于矩阵并返回矩阵作为 R 中的结果

java - 我应该如何设计具有继承的枚举?

Android测试项目找不到app类

java - 如何在 Java 文件中运行 Kotlin 库(通过 JitPack 分发)?

kotlin - 我可以在Kotlin中访问 “enclosing”对象以进行内联函数调用吗?

algorithm - 在 Scala 中处理联合、子集和超集

Android EditText 颜色问题