kotlin - 使用 lambda 的单功能监听器

标签 kotlin

对于所有众所周知的单函数监听器,我们可以使用更简单的 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/

相关文章:

kotlin - 如何通过检查参数的有效性来创建自定义 setter ?

intellij-idea - 我如何知道 Kotlin 中的推断类型?

android - Kotlin等待与协程异步

android - 如何在 Splashscreen API 中删除我的启动画面图标周围的圆形 mask ?

kotlin - PublishSubject `subscribeOn`行为

list - Kotlin 列表中的连续整数组

arrays - 数组<编号> : get and set Int values without casting

java - Android 9.0 Java.net.URL

android - 创建从 iOS (Swift) 到 Android(Kotlin) 的 Needle GaugeView

android - 旧 java 项目中的新 kotlin 文件 - 'Unresolved reference' R