Kotlin 1.6、Jetpack Compose 1.1.0编译错误

34

我已将我的项目升级至Kotlin 1.6.10,Compose 1.1.0-rc01以及compose编译器至1.1.0-rc02,因为我需要一些新的Compose功能。

在编译过程中,我现在遇到了这个错误,请问有解决方案吗? 在使用Kotlin 1.5.31、Compose/Compose编译器1.0.5时它是可以工作的。

java.lang.IllegalStateException: Symbol for kotlin.collections/mutableMapOf|-4813910536206556932[0] is unbound
at org.jetbrains.kotlin.ir.symbols.impl.IrBindablePublicSymbolBase.getOwner(IrPublicSymbolBase.kt:52)
at org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionPublicSymbolImpl.getOwner(IrPublicSymbolBase.kt:74)
at androidx.compose.compiler.plugins.kotlin.lower.LiveLiteralTransformer.visitCall(LiveLiteralTransformer.kt:663)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitCall(IrElementTransformerVoid.kt:199)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitCall(IrElementTransformerVoid.kt:24)
at org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl.accept(IrCallImpl.kt:47)
at org.jetbrains.kotlin.ir.expressions.IrExpression.transform(IrExpression.kt:33)
at org.jetbrains.kotlin.ir.expressions.IrExpressionBody.transformChildren(IrBody.kt:46)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitBody(IrElementTransformerVoid.kt:108)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitExpressionBody(IrElementTransformerVoid.kt:114)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitExpressionBody(IrElementTransformerVoid.kt:115)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitExpressionBody(IrElementTransformerVoid.kt:24)
at org.jetbrains.kotlin.ir.expressions.IrExpressionBody.accept(IrBody.kt:36)
at org.jetbrains.kotlin.ir.expressions.IrExpressionBody.transform(IrBody.kt:39)
at org.jetbrains.kotlin.ir.declarations.IrField.transformChildren(IrField.kt:41)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitDeclaration(IrElementTransformerVoid.kt:57)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitField(IrElementTransformerVoid.kt:81)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitField(IrElementTransformerVoid.kt:82)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitField(IrElementTransformerVoid.kt:24)
at org.jetbrains.kotlin.ir.declarations.IrField.accept(IrField.kt:34)
at org.jetbrains.kotlin.ir.IrElement$DefaultImpls.transform(IrElement.kt:32)
at org.jetbrains.kotlin.ir.IrElementBase.transform(IrElementBase.kt:19)
at org.jetbrains.kotlin.ir.util.TransformKt.transformInPlace(transform.kt:35)
at org.jetbrains.kotlin.ir.declarations.IrClass.transformChildren(IrClass.kt:66)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitDeclaration(IrElementTransformerVoid.kt:57)
at org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid.visitClass(IrElementTransformerVoid.kt:66)
at androidx.compose.compiler.plugins.kotlin.lower.LiveLiteralTransformer.access$visitClass$s780614737(LiveLiteralTransformer.kt:158)
at androidx.compose.compiler.plugins.kotlin.lower.LiveLiteralTransformer$visitClass$1.invoke(LiveLiteralTransformer.kt:466)
at androidx.compose.compiler.plugins.kotlin.lower.LiveLiteralTransformer$visitClass$1.invoke(LiveLiteralTransformer.kt:465)
at androidx.compose.compiler.plugins.kotlin.lower.DurableKeyVisitor.siblings(DurableKeyVisitor.kt:117)
at androidx.compose.compiler.plugins.kotlin.lower.DurableKeyVisitor$siblings$1.invoke(DurableKeyVisitor.kt:131)
at androidx.compose.compiler.plugins.kotlin.lower.DurableKeyVisitor.enter(DurableKeyVisitor.kt:96)
at androidx.compose.compiler.plugins.kotlin.lower.DurableKeyVisitor.siblings(DurableKeyVisitor.kt:131)
at androidx.compose.compiler.plugins.kotlin.lower.LiveLiteralTransformer.siblings(LiveLiteralTransformer.kt:194)
at androidx.compose.compiler.plugins.kotlin.lower.LiveLiteralTransformer.visitClass(LiveLiteralTransformer.kt:465)

etc.....```

1
如果您有此问题的最小复现,请在 https://goo.gle/compose-feedback 提交错误报告。 - chuckj
3
这是相关问题的票据链接:https://issuetracker.google.com/issues/211475860。 - extmkv
现在正在跟踪https://youtrack.jetbrains.com/issue/KT-50784 - JaviCasa
1
Kotlin 1.6.20已经修复了这个问题,一旦发布,更新Kotlin和Jetpack Compose到1.6.20+版本将是解决方案。 - Andy Himberger
5个回答

37

在更新Compose和Kotlin版本时,我在两个不同的项目中遇到了完全相同的问题。

移除kotlin-android-extensions插件解决了这两个项目中的问题。这意味着你不能再使用Kotlin synthetic进行视图绑定。


这是正确的答案,由于该插件已被弃用所引起。 - FireZenk
那么我不能在已经使用传统视图的 Android 应用程序中使用 Compose 吗? - Muhammad Ahmed AbuTalib
@MuhammadAhmedAbuTalib 是的,你可以!但是你不能使用Kotlin合成,这意味着你应该使用视图绑定或findviewbyid。 - Richard

10

我看到其他几份报告(包括我自己)也遇到了同样的问题。一个临时解决方法是使用较旧的compose编译器和一个支持你的kotlin版本的类似compose版本,这样就不需要强制升级kotlin,只需获得新的compose功能。在build.gradle中添加类似以下内容并附上支持你的kotlin版本的compose版本即可 (https://developer.android.com/jetpack/androidx/releases/compose-kotlin)。

composeOptions {
   
    kotlinCompilerExtensionVersion = '1.1.0-beta03'
}

为什么你需要一个降级编译器的更新版本?本主题开头的编译错误是 kotlin 1.6.0 和 1.6.10 中的一个 bug,为了解决它,这将只设置 compose 编译器使用较旧的 kotlin 版本。将其设置为更新版本会使您遭遇该错误,因此我不知道为什么您希望将其设置为更新版本。 - Andy Himberger

3
在使用Jetpack Compose和kotlin synthetic bindings在同一项目中时,会出现此问题。 移除用于synthetic binding的插件将解决此问题。 另外,synthetic binding现已弃用,您应该将代码迁移到view binding。 https://developer.android.com/topic/libraries/view-binding/migration 但是,目前对我来说不可能做到这一点,需要5-6天的时间,因为我有大约50-60个文件在使用它。 因此,我必须选择另一种方法来处理这种情况。
composeOptions {
    kotlinCompilerExtensionVersion "1.1.0-beta03"
}

我还需要将Kotlin版本降级。

ext.kotlin_version = "1.5.31"
ext.compose_version = '1.1.1'

0

升级 Kotlin 版本解决了我的问题。在升级时,请检查 开发者文档 中提到的 Compose-Kotlin 兼容性检查。

我已经升级到 Kotlin:1.6.20 并使用了 kotlinCompilerExtensionVersion = "1.2.0-alpha08"。这是一个较旧的 Kotlin 版本,您可以尝试最新版本。


-1
请使用以下版本来解决问题 composeOptions { kotlinCompilerExtensionVersion '1.1.0-beta03' kotlinCompilerVersion '1.5.31' }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接