Android Kotlin:将函数引用传递给crossinline lambda参数会导致java.lang.VerifyError

时间:2018-10-07 12:00:51

标签: android kotlin verifyerror

最近,我遇到了这种奇怪的行为:总的来说,我的应用程序可以正常工作并编译,但是当我尝试实例化一个片段时,该片段包含将函数引用传递给扩展内联函数的代码,该代码需要跨内联lambda我的应用程序抛出java.lang.VerifyError。

首先,我不知道问题的确切根源,因此我确实遵循了有关Stack Overflow的一些答案,并清除了缓存并删除了构建文件夹,但这没有帮助。因此,我试图进一步隔离问题并注释掉我的代码,直到找到导致错误的确切行:

overview_button_details.click (viewModel::startDetailGroupActivity)

点击的实现:

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

此组合无效,但我发现以下组合有效

使用:

  overview_button_details.click { viewModel.startDetailGroupActivity() }

和[1]。或将函数更改为非内联函数且不采用跨内联lambda:

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

我很困惑,因为编译器和android studio没有告诉我该函数[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)

我对此没有经验,所以我想知道这是一个错误还是我的错?如果是这样,哪里出错了?

0 个答案:

没有答案