2015-11-25 166 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