Android Kotlin: передача ссылки на функцию в перекрестный лямбда-аргумент вызывает java.lang.VerifyError - PullRequest
0 голосов
/ 07 октября 2018

Недавно я столкнулся с таким странным поведением: в целом мое приложение работает и компилируется как обычно, но когда я пытаюсь создать экземпляр фрагмента, который содержит код, который передает ссылку на функцию встроенной функции расширения, которая принимает кросс-строку лямбда моего приложениявыдает java.lang.VerifyError.

Сначала я не знал точного источника проблемы, поэтому я следовал некоторым ответам по переполнению стека, очистил кеш и удалил папки сборки, он не сталПомогите.Итак, я попытался выделить проблему дальше и закомментировал свой код, пока не нашел точную строку, которая вызвала ошибку:

overview_button_details.click (viewModel::startDetailGroupActivity)

Реализация клика:

[1] inline fun View.click( crossinline listener: () -> Unit) = setOnClickListener { _ -> listener() }

Эта комбинация нене работает, но я обнаружил, что следующие комбинации работают

Либо используя:

  overview_button_details.click { viewModel.startDetailGroupActivity() }

с [1].Или изменив функцию, чтобы она не была встроенной функцией и не принимала лямбду-строку:

fun View.click( listener: () -> Unit) = setOnClickListener { _ -> listener() }

Я запутался, потому что студия компилятора и андроида ничего не сказала мне, что эта функция [1] может вызватьошибка, ни трассировка стека мне не помогла:

 java.lang.VerifyError: Verifier rejected class ________.NewFragment due to bad method void _______.NewFragment.onViewCreated(android.view.View, android.os.Bundle) (declaration of '_______.NewFragment' appears in /data/app/______-1/split_lib_slice_4_apk.apk)
    at ________.main.MainViewModel.navigateOverview(MainViewModel.kt:93)
    at ________.main.MainActivity$mOnNavigationItemSelectedListener$1.onNavigationItemSelected(MainActivity.kt:71)
    at android.support.design.widget.BottomNavigationView$1.onMenuItemSelected(BottomNavigationView.java:182)
    at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
    at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
    at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
    at android.support.design.internal.BottomNavigationMenuView$1.onClick(BottomNavigationMenuView.java:95)
    at android.view.View.performClick(View.java:5233)
    at android.view.View$PerformClick.run(View.java:21211)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5539)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

У меня недостаточно опыта с этим, поэтому Интересно, это ошибка или это моя вина?Если так, то где ошибка?

...