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?
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.
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.
If you want to use Jetpack Compose in an existing project, you'll need to configure your project with required settings and dependencies.
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.
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 usesetContent
should add theactivity-compose:1.3.0-alpha02
dependency to theirdependencies
block to ensure that the1.3.0-alpha01
artifact is not used
So to fix your app, you should:
Remove the freeCompilerArgs += "-Xallow-unstable-dependencies"
line from the build.gradle
file (as it is no longer needed)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With