2015-11-25 5 views
2

я просто использовал Kotlins авто реорганизовать и это в основном оставил меня с этим:Котлин: Внутренняя сфера - Это

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

Который не работает. IntelliJ показывает мне, что this относится к внешнему классу, но не к OnPreDrawListener. Почему это? Котлинские документы говорят, что это всегда относится к внутренней области.

+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 метода является выражение функция) позволяет получить доступ к лямбда-х замыкание, т. е. переменные, объявленные в самом дальнем объеме, а не сама лямбда.

+0

вы уверены, что какой-то маркированный лямбда не сделал бы? – voddan

Смежные вопросы