Jetpack Compose:从协程中使用 lambda 调用函数时出现后端内部错误

Joh*_*lly 16 android android-jetpack-compose

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

重现起来非常容易......已将其范围缩小到以下步骤:

使用“空撰写活动”模板创建新项目。更新到 dev07(以前的版本也有问题)并添加以下内容build.gradle

composeOptions {
    kotlinCompilerExtensionVersion = "0.1.0-dev07"
}
Run Code Online (Sandbox Code Playgroud)

添加以下内容到MyActivity.kt

fun someFun(success: (String) -> Unit) {
}
Run Code Online (Sandbox Code Playgroud)

然后更新onCreate为以下内容:

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

    lifecycleScope.launch {
        someFun {
        }
    }
    setContent {
        MaterialTheme {
            Greeting("Android")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

请注意,您还需要添加以下依赖项build.gradle

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
Run Code Online (Sandbox Code Playgroud)

小智 33

确保将其添加到您使用 compose 的每个模块中

buildFeatures {
    compose true
}
Run Code Online (Sandbox Code Playgroud)

这是 alashow 的评论,也是唯一有效的方法。


Sum*_*ule 10

确保您已将 compose 添加到 Gradle insideandroid {...}块中。您必须为每个使用 compose 的模块执行此操作。请参考以下内容添加撰写:

buildFeatures {
    compose = true
}

composeOptions {
    kotlinCompilerExtensionVersion compose_version
}
Run Code Online (Sandbox Code Playgroud)