2015-11-25 165 views
2

我只是利用Kotlins自動重構的,它基本上給我留下了這一點:科特林:內範疇 - 這

coverView.viewTreeObserver.addOnPreDrawListener { 
    coverView.viewTreeObserver.removeOnPreDrawListener(this) 
    true 
} 

不工作。 IntelliJ顯示我this引用外部類但不是OnPreDrawListener。這是爲什麼? kotlin文檔說這總是指最內層的範圍。

+0

可否請您發佈'addOnPreDrawListener'的類型簽名?這是唯一重要的,我不知道你在這裏使用的是什麼樣的圖像 – voddan

+0

它是[這裏](https://developer.android.com/reference/android/view/ViewTreeObserver.html#addOnPreDrawListener(android.view .ViewTreeObserver.OnPreDrawListener))。爲什麼簽名很重要? IntelliJ告訴我它指的是最外層的類。 addOnPreDrawListener與removeOnPreDrawListener具有相同的簽名。 –

+1

看看http://stackoverflow.com/questions/33898748/how-to-reference-a-lambda-from-inside-it它是轉換器中的錯誤。 –

回答

2

要解決你的代碼,你可以使用object expression代替lambda這裏:

coverView.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { 
    override fun onPreDraw(): Boolean { 
     coverView.viewTreeObserver.removeOnPreDrawListener(this) 
     return true 
    } 
}) 

this在函數表達式表達式(和你傳遞給addOnPreDrawListener方法拉姆達爲函數表達式)允許您訪問拉姆達的閉包,即在其最外層範圍中聲明的變量,而不是lambda本身。

+0

你確定某種標籤的lambda不會這樣做嗎? – voddan