Не удалось встроить вызов метода «запомнить» в @androidx.compose.runtime.Составная

#android #kotlin #android-jetpack-compose

Вопрос:

У меня есть большой проект, и я решил добавить в него композицию jetpack. Сначала я подготовил отдельный проект с некоторыми @Composable компонентами, и все работало. Затем, после добавления источников и подготовительных зависимостей в мой проект во время компиляции, я начал получать эту ошибку:

 org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
File being compiled: C:/Users/.../CatalogScreen.kt
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:50)
    at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:239)
    at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException$default(CodegenUtil.kt:235)
    at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:68)
    at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:55)
    at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:41)
    ...
Caused by: java.lang.RuntimeException: Exception while generating code for:
FUN name:CatalogScreen visibility:public modality:FINAL <> () returnType:kotlin.Unit
  annotations:
    Composable
  BLOCK_BODY
    VAR PROPERTY_DELEGATE name:currentTab$delegate type:androidx.compose.runtime.MutableState<kotlin.Int> [val]
      CALL 'public final fun remember <T> (calculation: @[DisallowComposableCalls] kotlin.Function0<T of androidx.compose.runtime.ComposablesKt.remember>): T of androidx.compose.runtime.ComposablesKt.remember [inline] declared in androidx.compose.runtime.ComposablesKt' type=androidx.compose.runtime.MutableState<kotlin.Int> origin=null
        <T>: androidx.compose.runtime.MutableState<kotlin.Int>
        calculation: BLOCK type=kotlin.Function0<androidx.compose.runtime.MutableState<kotlin.Int>> origin=LAMBDA
          COMPOSITE type=kotlin.Unit origin=null
          FUNCTION_REFERENCE 'private final fun CatalogScreen$lambda-0 (): androidx.compose.runtime.MutableState<kotlin.Int> declared in ...CatalogScreenKt' type=kotlin.Function0<androidx.compose.runtime.MutableState<kotlin.Int>> origin=LAMBDA reflectionTarget=null

    at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:50)
    at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate$default(FunctionCodegen.kt:43)
    at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generateMethodNode(ClassCodegen.kt:349)
    ...
Caused by: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Couldn't inline method call 'remember' into
@androidx.compose.runtime.Composable public fun CatalogScreen(): kotlin.Unit defined in ...catalog
<no source>
Cause: Not generated
File is unknown
The root cause java.lang.IllegalStateException was thrown at: org.jetbrains.kotlin.codegen.inline.InlineCodegen$Companion.getCompiledMethodNodeInner(InlineCodegen.kt:578)
    at org.jetbrains.kotlin.codegen.inline.InlineCodegen.throwCompilationException(InlineCodegen.kt:101)
    at org.jetbrains.kotlin.codegen.inline.InlineCodegen.performInline(InlineCodegen.kt:141)
    at org.jetbrains.kotlin.backend.jvm.codegen.IrInlineCodegen.genInlineCall(IrInlineCodegen.kt:148)
    at org.jetbrains.kotlin.backend.jvm.codegen.IrInlineCallGenerator$DefaultImpls.genCall(IrInlineCallGenerator.kt:29)
    ...
Caused by: java.lang.IllegalStateException: Couldn't obtain compiled function body for IrBasedSimpleFunctionDescriptor: FUN IR_EXTERNAL_DECLARATION_STUB name:remember visibility:public modality:FINAL <T> (calculation:@[DisallowComposableCalls] kotlin.Function0<T of androidx.compose.runtime.ComposablesKt.remember>) returnType:T of androidx.compose.runtime.ComposablesKt.remember [inline]
    at org.jetbrains.kotlin.codegen.inline.InlineCodegen$Companion.getCompiledMethodNodeInner(InlineCodegen.kt:578)
    at org.jetbrains.kotlin.codegen.inline.InlineCodegen$Companion.access$getCompiledMethodNodeInner(InlineCodegen.kt:542)
    at org.jetbrains.kotlin.codegen.inline.InlineCodegen.createInlineMethodNode$backend(InlineCodegen.kt:535)
    at org.jetbrains.kotlin.codegen.inline.InlineCodegen.performInline(InlineCodegen.kt:134)
    ... 70 more
 

Мой простой код выглядит так:

 @Composable
fun CatalogScreen() {

    var currentTab by remember { mutableStateOf(0) }

}
 

В своем проекте я использую compose 1.0.1 , kotlin 1.5.21 , gradle 7.1.1 и множество плагинов и библиотек, включая сопрограммы и сериализацию kotlinx, однако уродливое удаление каждой зависимости не делает код работающим.

Может быть, кто-то сталкивался с такого рода ошибкой и знает, что может к ней привести или что может ее нарушить?

Комментарии:

1. Если это начало происходить после добавления зависимостей в рабочий проект, обнаружьте это с помощью двоичного поиска, например, сначала половину комментариев и т. Д. когда вы обнаружили проблему, сообщите об этом в службу отслеживания проблем или в службу поддержки конкретных зависимостей, или и то, и другое

2. Мне трудно сказать, связано ли это с этапом компиляции или с конфигурацией сборки. Я не уверен, почему мое решение работает, но… оно все еще работает 🙂

Ответ №1:

Решение было очень хитрым:

В моем buildSrc buildGradle у меня был следующий код:

 repositories {
    google()
    jcenter()
    maven(url = "https://storage.googleapis.com/r8-releases/raw")
}

plugins {
    `kotlin-dsl`
}

dependencies {
    implementation("com.android.tools.build:gradle:7.0.0")
}
 

Добавление api(kotlin("gradle-plugin:1.5.21")) в зависимости решало проблемы сборки.

Я оставляю эту подсказку для других разработчиков, которые повлияют на эту проблему.

Комментарии:

1. Это также устранило мою проблему. Но я не уверен, почему. Я менял материал в buildSrc, но зачем мне нужна зависимость в файле сборки buildSrc, чтобы она работала в отдельных модулях?

Ответ №2:

Возможно, вам также не хватает этого в файле build.gradle вашего модуля

 buildFeatures { // Enables Jetpack Compose for this module
    compose = true
}
composeOptions {
    kotlinCompilerVersion versions.kotlin
    kotlinCompilerExtensionVersion versions.composeCompiler
}
 

Ответ №3:

Я слышал, что всякий раз, когда возникает «внутренняя ошибка внутреннего компилятора», она исходит от самого компилятора и должна быть сообщена. Попробуйте создать новый проект из шаблонов Студии и посмотрите, компилируется ли он. Если это так, то просто скопируйте и вставьте свой код в этот.

Спасибо!

Комментарии:

1. и, конечно же, в прикрепленном вами фрагменте нет ошибки, при условии, что правильные зависимости и импорт уже есть в вашем проекте, как вы тоже упомянули в своем первоначальном вопросе.

2. Спасибо за ваше предложение, решение было простым, но очень трудным для изобретения. Я не знаю, связано ли это с компилятором или, скорее, с конфигурацией сборки

3. Эй, пожалуйста, посмотри, твое ли это дело. developer.android.com/jetpack/compose/gestures#nested-scrolling

4. Вместо того, чтобы явно добавлять зависимость, как в файле сборки, просто проверьте settings.gradle и измените версию там. Похоже, это ошибка в канарейке Шмеля 6