在 Kotlin Multiplatform 项目中与 Compose 共享 Activity
Shared Activity with Compose in Kotlin Multiplatform project
我在设置驻留在 KMM 项目的共享代码中并使用 Jetpack Compose 的 activity 时遇到问题。当 activity 在 Android source (/app) 中时,这工作正常。但是我想发布一个共享的 (/common) 库而不需要任何应用程序。
例如,我分叉了一个很棒的最小 KMM+Compose 项目:https://github.com/cyberhenoch/PeopleInSpace :
- 将撰写activity (SharedActivity) 添加到共享代码
- 更新了共享代码中的依赖项androidMain
编译正常,但在运行时我得到:
Process: com.surrus.peopleinspace, PID: 4067
java.lang.NoSuchMethodError: No static method setContent$default(Landroidx/activity/ComponentActivity;Landroidx/compose/runtime/CompositionContext;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V
in class Landroidx/activity/compose/ComponentActivityKt; or its super
classes (declaration of
'androidx.activity.compose.ComponentActivityKt' appears in
/data/app/com.surrus.peopleinspace-8P35Dcwzn9_G-xN9YdwFrA==/base.apk)
at 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(本地方法))
我应该怎么做才能让它发挥作用?任何帮助将不胜感激。
所需的更改是添加 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版本Community 2021.1
我在设置驻留在 KMM 项目的共享代码中并使用 Jetpack Compose 的 activity 时遇到问题。当 activity 在 Android source (/app) 中时,这工作正常。但是我想发布一个共享的 (/common) 库而不需要任何应用程序。
例如,我分叉了一个很棒的最小 KMM+Compose 项目:https://github.com/cyberhenoch/PeopleInSpace :
- 将撰写activity (SharedActivity) 添加到共享代码
- 更新了共享代码中的依赖项androidMain
编译正常,但在运行时我得到:
Process: com.surrus.peopleinspace, PID: 4067 java.lang.NoSuchMethodError: No static method setContent$default(Landroidx/activity/ComponentActivity;Landroidx/compose/runtime/CompositionContext;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V in class Landroidx/activity/compose/ComponentActivityKt; or its super classes (declaration of 'androidx.activity.compose.ComponentActivityKt' appears in /data/app/com.surrus.peopleinspace-8P35Dcwzn9_G-xN9YdwFrA==/base.apk) at 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(本地方法))
我应该怎么做才能让它发挥作用?任何帮助将不胜感激。
所需的更改是添加 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版本Community 2021.1