Avatar ·

Ошибка Backend Internal error при использовании clickable в Jetpack Compose

Привет, коллеги! Я начинающий разработчик на Kotlin и Jetpack Compose. Столкнулся с проблемой, которую не могу решить уже несколько часов. У меня есть простой экран с карточкой, на которую я хочу повесить обработчик нажатия. Я использую модификатор `.clickable`, но при компиляции получаю ошибку: ``` Backend Internal error: Exception during IR lowering ``` Вот мой код: ```kotlin @Composable fun MyScreen() { var count by remember { mutableStateOf(0) } Card( modifier = Modifier .fillMaxWidth() .padding(16.dp) .clickable { count++ } ) { Text("Нажато: $count") } } ``` Я пробовал разные варианты: выносил лямбду в отдельную переменную, использовал `Modifier.clickable(onClick = { count++ })`, но ошибка остаётся. Gradle собирает проект, но при запуске на эмуляторе или реальном устройстве вылетает эта ошибка. Использую последнюю стабильную версию Compose (1.5.4) и Kotlin 1.9.21. Проблема возникает только с clickable, другие модификаторы работают нормально. Что я делаю не так? Может, это баг библиотеки или нужно обновить плагины? Помогите, пожалуйста, разобраться! <<>>

Причина ошибки

Ошибка Backend Internal error: Exception during IR lowering в Jetpack Compose обычно возникает из-за несовместимости версий Kotlin и Compose Compiler. Дело в том, что Compose использует собственный плагин компилятора (Compose Compiler), который генерирует IR-код (Intermediate Representation) для модификаторов, лямбд и других Compose-специфичных конструкций. Если версия Kotlin не соответствует версии Compose Compiler, процесс "понижения" (lowering) IR ломается, вызывая эту ошибку.

В вашем случае проблема не в коде, а в конфигурации проекта. Даже если вы используете "последние стабильные версии", они могут быть несовместимы. Например, Compose 1.5.x требует Kotlin 1.9.0-1.9.10, а вы указали Kotlin 1.9.21 — это уже несовместимость.

Решение

Вам нужно синхронизировать версии Kotlin и Compose Compiler. Есть два способа:

Способ 1: Использовать Kotlin, совместимый с вашей версией Compose

Откройте файл build.gradle.kts (уровня проекта) и укажите версию Kotlin, которая поддерживается вашей версией Compose. Актуальную таблицу совместимости можно найти в официальной документации. На момент написания ответа для Compose 1.5.4 подходит Kotlin 1.9.10:

// build.gradle.kts (project level)
plugins {
    id("org.jetbrains.kotlin.android") version "1.9.10" apply false
    // другие плагины...
}

После изменения синхронизируйте проект (Sync Now).

Способ 2: Явно указать версию Compose Compiler (рекомендуется)

Лучшая практика — принудительно задать версию плагина Compose Compiler, которая совместима с вашим Kotlin. Для этого в файле build.gradle.kts модуля (app) добавьте блок composeOptions:

// build.gradle.kts (app module)
android {
    // ...
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.8" // для Kotlin 1.9.21
    }
}

Таблица соответствия версий (актуальна на конец 2024 года):

  • Compose Compiler 1.5.8 → Kotlin 1.9.21
  • Compose Compiler 1.5.7 → Kotlin 1.9.20
  • Compose Compiler 1.5.5 → Kotlin 1.9.11
  • Compose Compiler 1.5.4 → Kotlin 1.9.10

После добавления kotlinCompilerExtensionVersion ошибка должна исчезнуть. Ваш код корректен, проблема исключительно в сборке.

Дополнительные советы

  • Всегда проверяйте таблицу совместимости на официальной странице Compose Kotlin Compatibility.
  • Если используете compose-bom (Bill of Materials), убедитесь, что его версия также совместима с вашим Kotlin.
  • Очистите кеш после изменения версий: Build → Clean Project, затем Build → Rebuild Project.
<<>>

Альтернативное решение: проверка обновлений Gradle и плагинов

Иногда ошибка Backend Internal error возникает не из-за несовместимости Kotlin/Compose, а из-за устаревшего плагина Gradle или Android Gradle Plugin (AGP). Попробуйте обновить их до последних стабильных версий:

// build.gradle.kts (project level)
plugins {
    id("com.android.application") version "8.2.0" apply false
    id("org.jetbrains.kotlin.android") version "1.9.21" apply false
    // ...
}

Также проверьте, что в gradle-wrapper.properties указана актуальная версия Gradle (например, 8.4+). После обновления выполните File → Invalidate Caches and Restart.

Если проблема остаётся, попробуйте временно заменить .clickable на Modifier.pointerInput(Unit) { detectTapGestures { count++ } } — это поможет убедиться, что ошибка связана именно с компилятором, а не с логикой кода.