Jetpack Compose: Backend Внутренняя ошибка при вызове функции с лямбдой из Coroutine - PullRequest
1 голос
/ 22 марта 2020

Что-то странное, но получал ошибку «Внутренняя ошибка бэкенда» при использовании Jetpack Compose и выяснил, что она была вызвана вызовом функции, которая принимает лямбда-выражение из сопрограммы.

Воспроизвести довольно легко .... сузили его до следующих шагов:

Создайте новый проект, используя шаблон «Очистить действие». Обновите до 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"

1 Ответ

0 голосов
/ 19 апреля 2020

Другим способом воспроизвести проблему, кажется, являются вложенные лямбда-выражения в любом месте вашей кодовой базы, например:

private val scanResult = MutableLiveData<String>()

init {

    coroutineScope.launch {

        scanResult.asFlow()
            .distinctUntilChanged()
            .debounce(500)
            .collect { result -> processText(result) } // <-- This nested lambda breaks the build.
    }
}

private fun processText(text: String) {
    TODO()
}

Поэтому кажется, что root -причина ошибки сборки не объявляет методы, которые принимают лямбда-выражения в качестве входных параметров, вместо этого , используя вложенные лямбда-выражения .

...