对于所有众所周知的单函数监听器,我们可以使用更简单的 lambda 表示法
view.setOnClickListener { do() }
而不是原始的、更长的 Java 方式
view.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
do()
}
})
但是究竟是什么让它起作用呢?我试着对我自己的听众做同样的事情:
private var listener: OnCopyPasteClickListener? = null
interface OnCopyPasteClickListener {
fun onPasteClick(text: String)
}
fun setOnCopyPasteClickListener(onCopyPasteClickListener: OnCopyPasteClickListener) {
listener = onCopyPasteClickListener
}
虽然长方法工作得很好:
copypaste.setOnCopyPasteClickListener(object : CopyPasteMenu.OnCopyPasteClickListener {
override fun onPasteClick(text: String) {
do(text)
}
})
我不能让它接受短的:
copypaste.setOnCopyPasteClickListener {
do(it)
}
IDE 报类型不匹配错误。
最佳答案
其实,如果你只有一个函数需要调用,我推荐你使用Kotlin Callback。
typealias OnDoWorkListener = ((String) -> Unit)
class Work {
var doWork: OnDoWorkListener? = null
fun doSomething() {
doWork?.invoke("Message Here")
}
}
在您的函数中,您只需为其设置回调
fun main() {
val work = Work()
work.doWork = {
Log.d("WORK", "This gets called from the `work` object. Message: $it")
}
work.doSomething();
}
我们也可以使用函数来设置监听器。
class Work {
var doWork: OnDoWorkListener? = null
fun doSomething() {
doWork?.invoke("Message Here")
}
fun setOnWorkListener(listener: OnDoWorkListener) {
doWork = listener
}
}
fun main() {
val work = Work()
work.setOnWorkListener {
Log.d("WORK", "This gets called from the `work` object. Message: $it")
}
work.doSomething()
}
关于kotlin - 使用 lambda 的单功能监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56805121/