问题描述
我在设置驻留在 KMM 项目的共享代码中并使用 Jetpack Compose 的活动时遇到问题。当 Activity 位于 Android 源 (/app) 中时,这可以正常工作。但我想发布一个没有任何应用程序的共享 (/common) 库。
举个例子,我分叉了一个很棒的最小 KMM+Compose 项目:https://github.com/cyberhenoch/PeopleInSpace :
它编译得很好,但在运行时我得到:
进程:com.surrus.peopleinspace,PID:4067 java.lang.NoSuchMethodError: 无静态方法 setContent$default(Landroidx/activity/ComponentActivity;Landroidx/compose/runtime/CompositionContext;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V 在类 Landroidx/activity/compose/ComponentActivityKt 中;或者它的超级 类(声明 'androidx.activity.compose.ComponentActivityKt'出现在 /data/app/com.surrus.peopleinspace-8P35Dcwzn9_G-xN9YdwFrA==/base.apk) 在 com.surrus.android.SharedActivity.onCreate(SharedActivity.kt:12)
我尝试添加此处描述的选项 https://developer.android.com/jetpack/compose/setup#configure_gradle 但是
- 不是所有的都可以添加到通用模块中(kotlinoptions?)
- 在原始项目中,它们不是必需的,而且效果很好
- 在以不同的组合添加其中的几个之后,它甚至无法编译(异常:java.lang.NoClassDefFoundError:org/jetbrains/kotlin/serialization/DescriptorSerializerPlugin 在 java.base/java.lang.classLoader.defineClass1(Native Method))
我应该怎么做才能让它发挥作用?任何帮助将不胜感激。
解决方法
所需的更改是添加 org.jetbrains.compose 插件。
基于 IDEA(不是 Android Studio)模板,用于使用 Compose 创建多平台项目 Jetpack Compose for Desktop (Experimental) -> Mutiplatform uses Kotlin 1.4.30
项目 build.gradle.kts
buildscript {
repositories {
gradlePluginPortal()
}
}
...
allprojects{
...
maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") }
}
常用模块 build.gradle.kts
plugins{
...
id("org.jetbrains.compose") version "0.3.1"
}
除此之外,在添加插件之后,Android Studio 搞砸了显示“未选择模块”错误的模块以及此 question 中描述的问题。但是在 IDEA 中打开它显示了修复多模块 gradle 项目的选项。我以这种方式修复它并在 Android Studio 中重新打开。
所需的更改可以在 the example repo 中看到。
AS 版本 2020.3.1 Canary 15 & IDEA 版本社区 2021.1
,这看起来像是一个依赖错误。
检查您是否已将 androidx.activity:activity-compose:1.3.0-alpha07
添加到 androidMain
如果它已经存在 - 尝试将您在 android 应用模块(运行良好)中拥有的所有其他依赖项添加到您的 androidMain