2017-07-07 69 views
3

所以我试图在Kotlin中创建一个监听器。我只想传递一个将在我的代码中执行的方法。就像这样:如何在Kotlin中声明一个函数作为变量

override fun setButtonClickListener(listener: (text: String) -> Unit) { 
    this.listener = listener 
} 

但是,当我宣布我的听众,我必须这样声明它:

private var listener : (text: String) -> Unit = null!! 

否则我作为会抱怨。但是这个 !!在一个空对象接缝很奇怪。我应该如何声明这个监听器?

谢谢!

回答

8

有很多方法可以在kotlin中声明一个函数作为变量。

您可以使用 lateinit properties来初始化属性在后面,例如

private lateinit var listener : (text: String) -> Unit 

使listener空的,但你必须用safe-call调用它:这样listener?.handle(...)

private var listener : ((text: String) -> Unit)? = null 

声明它为空的lambda以避免NPException,例如:

private var listener : (String) -> Unit = {} 

声明一个私有函数,然后你可以通过function reference expression引用它,比如:

private var listener = this::handle 

private fun handle(text:String) = TODO() 

:当你声明一个函数变量,参数名称是可选,例如:

private var listener : (text:String) -> Unit = TODO() 
//      |--- parameter name is omitted 
private var listener : (String) -> Unit = TODO() 
+0

谢谢!我工作得很好。有点难以在文档中找到这个... –

+0

@LeandroBorgesFerreira完全没有。 –

0

这是我的方式。

fun setOnCardClickListener(listener: OnCardClickListener){ 
    this.listener = listener 
} 

adapter.setOnCardClickListener(object : OnCardClickListener { 
     override fun onClick(link: String) { 



     } 
    }) 

我的界面类似这样的

interface OnCardClickListener { 

    fun onClick(link: String) 

} 
相关问题