Kotlin: 内部作用域 - This

6
我刚刚使用了Kotlin的自动重构功能,它基本上留给我这个:
coverView.viewTreeObserver.addOnPreDrawListener {
    coverView.viewTreeObserver.removeOnPreDrawListener(this)
    true
}

这段代码无法正常运行。IntelliJ显示this指向的是外部类,而非OnPreDrawListener。为什么会这样呢?Kotlin文档中说明this总是指向最内层的作用域。

请问您能否发布 addOnPreDrawListener 的类型签名?这是唯一重要的事情,我不确定您在使用哪个库。 - voddan
这里是相关链接:https://developer.android.com/reference/android/view/ViewTreeObserver.html#addOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener)。为什么签名很重要?IntelliJ告诉我它指的是最外层的类。addOnPreDrawListener和removeOnPreDrawListener具有相同的签名。 - Paul Woitaschek
1
请查看https://dev59.com/iVsX5IYBdhLWcg3wY-gh,这是转换器中的一个错误。 - Kirill Rakhman
1
不支持访问lambda的this实例。因此,将访问this的匿名类转换为lambda是Java到Kotlin转换器中的错误。 - Kirill Rakhman
我为此提交了一个问题:https://youtrack.jetbrains.com/issue/KT-10202 - Kirill Rakhman
显示剩余2条评论
1个回答

13
为了修复你的代码,你可以在这里使用对象表达式而不是lambda
coverView.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
    override fun onPreDraw(): Boolean {
        coverView.viewTreeObserver.removeOnPreDrawListener(this)
        return true
    }
})

this表达式在函数表达式中(以及传递给addOnPreDrawListener方法的lambda是函数表达式)允许您访问lambda的闭包,即在其最外层范围内声明的变量,而不是lambda本身。


你确定一个带标签的lambda不行吗? - voddan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接