【发布时间】:2020-03-22 08:30:04
【问题描述】:
有点奇怪,但在使用 Jetpack Compose 时出现“后端内部错误”错误,结果发现它是通过调用从协程中获取 lambda 的函数触发的。
很容易重现....已将范围缩小到以下步骤:
使用“Empty Compose Activity”模板创建新项目。更新到 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"
【问题讨论】:
-
AFAIK、Jetpack Compose 和协程目前不能一起工作。这将长期有效,只是现在不行。
-
看过一些关于此的内容,但让我感到困惑的是,其他情况似乎正在发挥作用,例如从 ViewModel 中的 viewModelScope 调用挂起函数。问题似乎只有在传递 lambda 时才会发生(例如,如果使用 collect() 或只是此处显示的基本示例)
-
也许协程在不包含对
@Composable函数(如MaterialTheme()或Greeting())的调用的 Kotlin 文件中很好。 -
原始问题将所有此类调用都放在单独的文件中......这在这篇文章中有点捏造,只是为了说明查看问题所需的最低限度。
-
可能不相关,但是当我没有在 build.gradle (buildFeatures.compose=true) 中启用 compose 时出现“后端内部”错误
标签: android android-jetpack-compose