2015-12-06 6 views
2

я не могу получить доступ к внешней метод внутри анонимного одинне удается получить доступ к внешнему классу от анонимного класса

class MyClass() 
{ 
    fun doSomeStuff() 
    { 
     for (brandView in holder.brandImages) 
     { 
      brandView.onClick { 
       if (brandView.brandId != null) 
       { 
        notifyStateChanged() 
       } 
      } 
     } 
    } 
    fun notifyStateChanged() 
    { 
     print("something") 
    } 
} 

Я получил компиляцию ошибки времени:

Error:(46, 31) org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Don't know how to generate outer expression for class <closure-BrandsBarView$1> 
Cause: Don't know how to generate outer expression for class <closure-BrandsBarView$1> 
File being compiled and position: (46,31) in C:/Users/piotr/IdeaProjects/MerciIt/app/src/main/java/pl/com/digita/merciit/app/ui/controls/colorswitcher/brandsbar/BrandsBarView.kt 
PsiElement: { 
       if (brandView.brandId != null) 
       { 
        notifyStateChanged() 
        //brandView.setTicked(!brandView.isTicked) 
       } 
      } 
The root cause was thrown at: CodegenContext.java:160 
    at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:299) 
(...) 

Так что я делаю неправильно ?

Только для теоретических дискуссий:

for (brandView in holder.brandImages) 
{ 
    setupBrandView(brandView) 
} 

fun setupBrandView(brandView: BrandTickerView) 
{ 
    brandView.onClick {brandView.isTicked = !brandView.isTicked; dataChanged?.invoke() } 

} 

работает нормально

+0

Если у вас есть сбой компилятора, такой как выше, вы должны сообщить об аварии на https://youtrack.jetbrains.com, так как это не проблема синтаксиса кода. –

ответ

3

В анонимных классах this относится к внешнему классу. Из object внешней деятельности должны быть переданы явно

class MainActivity : Activity() { 
    public override fun onCreate(savedInstanceState: Bundle?) { 
... 
     text_view.setOnClickListener{ v -> 
      this.doActivityStuff() 
     } 
... 
    fun doActivityStuff() { 
     // do some stuff 
    } 
    text_view.setOnClickListener(object : View.OnClickListener { 
     override fun onClick(v: View?) { 
      this.onClick(v) // this refer to onClickListener 
      [email protected]() // this refer to MainActivity 
     } 
    }) 
} 

Чтобы помочь в вашей ситуации это будет приятно видеть классы иерархии.

+0

Спасибо за ваш комментарий. Я добавил несколько строк кода, чтобы дать лучший контекст этим snipplets. Я также пробовал с квалифицированным этим без везения. – piotrpo

+0

также обеспечивают класс brandView – vigilancer

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