Jetpack撰写:从协程调用带有lambda的函数时,后端内部错误

时间:2020-03-22 08:30:04

标签: android android-jetpack-compose

奇怪的排序,但是在使用Jetpack Compose时出现“后端内部错误”错误,结果是通过调用从协程内部获取lambda的函数触发的。

很容易复制。...已将其范围缩小到以下步骤:

使用“空撰写活动”模板创建新项目。更新至dev07(以前的版本也存在问题),并在build.gradle

中添加以下内容
composeOptions {
    kotlinCompilerExtensionVersion = "0.1.0-dev07"
}

将关注者添加到MyActivity.kt

fun someFun(success: (String) -> Unit) {
}

然后将onCreate更新为以下内容:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    lifecycleScope.launch {
        someFun {
        }
    }
    setContent {
        MaterialTheme {
            Greeting("Android")
        }
    }
}

构建项目,然后看到以下错误:

e: java.lang.IllegalStateException: Backend Internal error: Exception during code generation
Element is unknownThe root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:42)
    at org.jetbrains.kotlin.codegen.CompilationErrorHandler.lambda$static$0(CompilationErrorHandler.java:35)
    at org.jetbrains.kotlin.backend.jvm.JvmBackendFacade.doGenerateFilesInternal$backend_jvm(JvmBackendFacade.kt:114)

请注意,您还需要向build.gradle

添加以下依赖项
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"

1 个答案:

答案 0 :(得分:1)

重现此问题的另一种方法似乎是在代码库中的任何地方嵌套lambda,例如:

private val scanResult = MutableLiveData<String>()

init {

    coroutineScope.launch {

        scanResult.asFlow()
            .distinctUntilChanged()
            .debounce(500)
            .collect { result -> processText(result) } // <-- This nested lambda breaks the build.
    }
}

private fun processText(text: String) {
    TODO()
}

因此,构建错误的根本原因不是在声明将lambda作为输入参数的方法,而是使用嵌套的lambda