2017-07-07 67 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) 

} 
相關問題