Обновление до Jetpack Compose Alpha 12 вызывает ошибки в setContent

Я обновился до Jetpack Compose 1.0.0-alpha12 и начал сталкиваться с проблемами.

Во-первых, использованный мной метод setContent был признан устаревшим.

Из примечаний к выпуску Alpha 12 я заметил что он сказал:

ComponentActivity.setContent перемещен в androidx.activity.compose.setContent в модуле androidx.activity: activity-compose. (Icf416)

Поэтому я удалил свой import androidx.compose.ui.platform.setContent и переключил его на import androidx.activity.compose.setContent, что устранило устаревание.

Однако затем я получил сообщение об ошибке:

w: Flag is not supported by this version of the compiler: -Xallow-jvm-ir-dependencies
w: ATTENTION!
This build uses unsafe internal compiler arguments:
-XXLanguage:+NonParenthesizedAnnotationsOnFunctionalTypes
This mode is not recommended for production use,
as no stability/compatibility guarantees are given on
compiler or generated code. Use it at your own risk!
e: Classes compiled by an unstable version of the Kotlin compiler were found in dependencies.
Remove them from the classpath or use '-Xallow-unstable-dependencies' to suppress errors
e: /[my path]/MainActivity.kt: (39, 9): Class 'androidx.activity.compose.ComponentActivityKt' is
compiled by an unstable version of the Kotlin compiler and cannot be loaded by this compiler

И снова я смог обойти это, изменив свой build.gradle файл, чтобы он имел:

kotlinOptions {
    jvmTarget = '1.8'
    useIR = true
    // I added this line
    freeCompilerArgs += "-Xallow-unstable-dependencies"
}

Хотя это позволило мне скомпилировать приложение, теперь во время выполнения я получаю следующее исключение:

java.lang.NoSuchMethodError: No static method setContent(
Landroidx/activity/ComponentActivity;Landroidx/compose/runtime/Com
positionContext;Lkotlin/jvm/functions/Function2;)V in class 
Landroidx/activity/compose/ComponentActivityKt; or its super classes
(declaration of 'androidx.activity.compose.ComponentActivityKt' appears in [my apk]

Как я могу исправить это и обновить свое приложение до Jetpack Compose 1.0.0-alpha12?


person ianhanniballake    schedule 10.02.2021    source источник


Ответы (2)


Согласно этой проблеме, эта проблема связана с новым androidx.activity:activity-compose:1.3.0-alpha01 артефактом.

Из этого выпуска:

Выпущено действие 1.3.0-alpha02, в котором устранена эта проблема.

Приложения, использующие Compose alpha12 и особенно такие артефакты, как androidx.compose.ui:ui-test-junit4:1.0.0-alpha12, которые используют setContent внутри, должны добавить activity-compose:1.3.0-alpha02 зависимость к своему блоку dependencies, чтобы гарантировать, что артефакт 1.3.0-alpha01 не используется

Итак, чтобы исправить свое приложение, вам следует:

  1. Удалите строку freeCompilerArgs += "-Xallow-unstable-dependencies" из файла build.gradle (так как она больше не нужна)

  2. Добавьте конкретную зависимость от Activity Compose 1.3.0-alpha02:

implementation 'androidx.activity:activity-compose:1.3.0-alpha02'

При добавлении этой зависимости любое прямое использование setContent, а также внутреннее использование androidx.compose.ui:ui-tooling:1.0.0-alpha12 или androidx.compose.ui:ui-test-junit4:1.0.0-alpha12 будет использовать фиксированный выпуск Activity Compose 1.3.0-alpha02.

person ianhanniballake    schedule 10.02.2021
comment
Привет, есть ли где-нибудь ресурс, который в удобной для восприятия форме связывает все эти изменения? - person Alan Hortz; 02.03.2021

С Activity 1.3.0-alpha02, setContent работает, но появилась другая ошибка.

Execution failed for task ':app:mergeDebugJavaResource'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
   > 2 files found with path 'META-INF/AL2.0' from inputs:

Пришлось использовать обходной путь, чтобы создать его

    packagingOptions {
        exclude 'META-INF/AL2.0'
        exclude 'META-INF/LGPL2.1'
    }

И все еще есть предупреждение Flag is not supported by this version of the compiler: -Xallow-jvm-ir-dependencies

person joyl1216    schedule 23.02.2021
comment
Если дело не в setContent, тогда это действительно не ответ на этот вопрос, не так ли? Похоже, вы столкнулись с совершенно разными проблемами, связанными с переходом на Kotlin 1.4.3.0, а именно с эта проблема Kotlin (не связанная с Compose) и использование ненужного флага, который вы оставили. - person ianhanniballake; 23.02.2021
comment
Ты прав. Создал еще один новый вопрос по этому поводу. stackoverflow.com/questions/66343654/ - person joyl1216; 24.02.2021