Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upgrading to Jetpack Compose Alpha 12 causes errors on setContent

I upgraded to Jetpack Compose 1.0.0-alpha12 and started to run into issues.

Firstly, the setContent method I was using showed as deprecated.

From the Alpha 12 release notes, I noticed that it said:

ComponentActivity.setContent has moved to androidx.activity.compose.setContent in the androidx.activity:activity-compose module. (Icf416)

So I removed my import androidx.compose.ui.platform.setContent and switched it to import androidx.activity.compose.setContent, which removed the deprecation.

However, I then got an error that says:

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

And again, I was able to work around that by changing my build.gradle file to have:

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

While that let me compile my app, I now get the following exception at runtime:

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]

How can I fix this and upgrade my app to Jetpack Compose 1.0.0-alpha12?

like image 200
ianhanniballake Avatar asked Feb 10 '21 23:02

ianhanniballake


People also ask

Is Jetpack Compose ready for production 2022?

Jetpack compose is stable and ready for production but Google still continues to bring new features to the library on every new release, some features are graduated to stable from experimental whilst new features or APIs are introduced as experimental.

Should I use Jetpack Compose or XML?

Compose allows you to do more with less code compared to XML. Compose is Intuitive. This means that you just need to tell Compose what you want to show the user. Compose is compatible with all your existing code: you can call Compose code from Views and Views from Compose.

Can I add Jetpack Compose to existing project?

If you want to use Jetpack Compose in an existing project, you'll need to configure your project with required settings and dependencies.

Does Jetpack Compose increase app size?

Let's see how Compose affects the size of the projects mentioned above. The following results are for the minified release APK of each project with resource and code shrinking enabled, using R8 full mode, and measured using APK Analyzer. Tivi saw a 46% reduction in APK size, from 4.49 MB to 2.39 MB.


1 Answers

As per this issue, this issue is related to the new androidx.activity:activity-compose:1.3.0-alpha01 artifact.

From that issue:

Activity 1.3.0-alpha02 has been released and fixes this issue.

Apps using Compose alpha12 and specifically artifacts like androidx.compose.ui:ui-test-junit4:1.0.0-alpha12 that internally use setContent should add the activity-compose:1.3.0-alpha02 dependency to their dependencies block to ensure that the 1.3.0-alpha01 artifact is not used

So to fix your app, you should:

  1. Remove the freeCompilerArgs += "-Xallow-unstable-dependencies" line from the build.gradle file (as it is no longer needed)

  2. Add a specific dependency on Activity Compose 1.3.0-alpha02:

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

By adding that dependency, any direct usages of setContent as well as internal usages by androidx.compose.ui:ui-tooling:1.0.0-alpha12 or androidx.compose.ui:ui-test-junit4:1.0.0-alpha12 will use the fixed Activity Compose 1.3.0-alpha02 release.

like image 199
ianhanniballake Avatar answered Oct 18 '22 14:10

ianhanniballake