kotlin 为什么我得到后端内部错误:使用Jetpack组合可点击修改器时出现“IR降低错误期间出现异常”?

brqmpdu1  于 2022-11-25  发布在  Kotlin
关注(0)|答案(9)|浏览(205)

我正在Surface中创建自定义Checkbox,该Surface具有Modifier.clickable

Surface(
        modifier = Modifier
            .clickable(
                enabled = enabled,
                interactionSource = interactionSource,
                indication = rememberRipple(),
                role = Role.Checkbox,
                onClick = { onCheckedChange(!checked) }
            )
            .then(modifier),
    ) {
        Row {
            Checkbox(checked = checked, onCheckedChange = {}, colors = colors)
            Text(text = text ?: "")
        }
    }

当我尝试构建它时,我得到了Exception during IR lowering error错误:

org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
File being compiled: /home/rene/AndroidStudioProjects/pass13/app/src/main/java/com/aresid/simplepasswordgeneratorapp/ui/widgets/Checkbox.kt

请参阅完整的堆栈跟踪here
删除Modifier.clickable可解决构建问题。
我已经尝试了升级/降级一些版本,但没有任何工作正常。
目前,我正在使用这些版本:

ext.versions = [
            'compileSdk': 31,
            'targetSdk' : 30,
            'minSdk'    : 26,
            'kotlin'    : '1.5.30',
            'navigation': '2.3.5',
            'compose'   : '1.0.2'
    ]
有人知道如何解决这个问题吗?
tkclm6bt

tkclm6bt1#

在我的情况下,我忘记添加在build.gradle中

android {
 ... 

    buildFeatures {
       compose true
    }
    composeOptions {
       kotlinCompilerExtensionVersion '1.0.3'
       kotlinCompilerVersion '1.5.30'
    }
}
8wtpewkr

8wtpewkr2#

所以我按照@PhilipDukhov的建议,通过JetBrains的问题跟踪器与他们取得了联系,他们解决了我的问题:https://youtrack.jetbrains.com/issue/KT-48815
我在我的应用的build.gradle文件中使用了kotlinCompilerExtensionVersion = versions.composeVersion,这是不正确的。versions.composeVersion是Gradle提供的,但似乎已弃用。您应该自己手动编写正在使用的版本。

lmvvr0a8

lmvvr0a83#

在我的情况下,我已经创建了独立的模块,以维护组件和主题独立于功能模块。所以更新下面的模块gradle内的android,为我工作。

android {
.
.
.
         buildFeatures {
                compose true
            }
            composeOptions {
                 kotlinCompilerExtensionVersion '1.0.3'
                 kotlinCompilerVersion '1.5.30'
            }
    }
dgenwo3n

dgenwo3n4#

这是因为JetpackCompose!在gradle 7.2中,您应该在android块的build.gradle中添加以下行:

kotlinOptions {
        jvmTarget = "1.8"
    }
    
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.0.4"
    }
sr4lhrrt

sr4lhrrt5#

确保您已将compose添加到gradle中,您可以将其添加到android {...}块中。请参考以下内容添加compose:

buildFeatures {
    compose = true
}

composeOptions {
    kotlinCompilerExtensionVersion compose_version
}
9w11ddsr

9w11ddsr6#

这听起来可能违反直觉(毕竟,错误显示为“Backend Internal Error”),但对我来说,重新启动Android Studio客户端修复了它。

e4yzc0pl

e4yzc0pl7#

当我在类的init块中向Composable函数传递一些参数时,发生了这个构建错误:

class AndroidKeyboardView(context: Context) : FrameLayout(context) {

    init {
        inflate(context, R.layout.keyboard_view, this)
        findViewById<ComposeView>(R.id.compose_view).setContent {
            // The Build Error occurred because of passing the argument. If I remove passing argument `context as IMEService` all works fine.
            KeyboardScreen(context as IMEService) 
        }
    }
}

@Composable
fun KeyboardScreen(connection: IMEService? = null) { ... }

要使其编译无误,应使用辅助构造函数而不是init {}块:

class AndroidKeyboardView(context: Context) : FrameLayout(context) {

    constructor(service: IMEService) : this(service as Context) {
        inflate(service, R.layout.keyboard_view, this)
        findViewById<ComposeView>(R.id.compose_view).setContent {
            KeyboardScreen(connection = service)
        }
    }
}
lnlaulya

lnlaulya8#

对我来说,我需要确保两件事:

首先,kotlinCompilerExtensionVersion与其他撰写版本相同(或兼容-请参见以下链接),即

composeOptions {
    kotlinCompilerExtensionVersion "$compose_version"
} 

...
dependencies {

   /**
    * Compose UI layout framework related
    */
   implementation "androidx.compose.ui:ui:$compose_version"
   ...
}

其次,compose_version与您目前的Kotlin插件相容。请在此Compose compatibility map检查

wfsdck30

wfsdck309#

我通过以下步骤解决了问题
1.清理项目
1.删除.gradle和.idea文件夹
1.使缓存失效/重新启动
1.同步分级
1.重建项目

相关问题