Exception in thread "main" java.lang.NoSuchMethodError: 'void androidx.compose.ui.graphics.SkiaBackedCanvas_skikoKt.setAlphaMultiplier(androidx.compose.ui.graphics.Canvas, float)'
maxrave-dev opened this issue · 2 comments
maxrave-dev commented
Describe the bug
When I try to build and run Compose Desktop App in my Ubuntu 23.10, I have an error
But when I run in Android Target, it runs normally.
Affected platforms
- Desktop (Windows, Linux, macOS)
Versions
- Libraries:
- Compose Multiplatform version: 1.6.10
- Navigation Multiplatform version: 2.7.0-alpha07
- ...
- Kotlin version: 2.0.0
- OS version(s) : Ubuntu 23.10
- OS architecture (x86 or arm64): x86_64
- JDK (for desktop issues): JetBrains Runtime 17.0.10
To Reproduce
Steps to reproduce the behavior:
- Run this code snippet:
@Composable fun MainScreen() { val navController = rememberNavController() Scaffold( bottomBar = { BottomNavigationBar(navController) } ) { BottomNavGraph( navController = navController ) } } //In App.kt @Composable @Preview fun App() { MaterialTheme { MainScreen() } }
- Run ./gradlew run
Expected behavior
Should not crash and show navigation bar like Android Target
Additional context
Crash log:
Task :composeApp:run
(java:33049): Gtk-WARNING **: 14:15:46.931: Theme directory 16x16/panel of theme Mkos-Big-Sur-Night has no size field
(java:33049): Gtk-WARNING **: 14:15:46.936: Theme directory 16x16@2x/places of theme Mkos-Big-Sur-Night has no size field
(java:33049): Gtk-WARNING **: 14:15:46.942: Theme directory 24x24/apps of theme Mkos-Big-Sur-Night has no size field
(java:33049): Gtk-WARNING **: 14:15:46.945: Theme directory 24x24@2x/panel of theme Mkos-Big-Sur-Night has no size field
(java:33049): Gtk-WARNING **: 14:15:46.946: Theme directory 24x24@2x/panel of theme Mkos-Big-Sur-Night has no size field
Exception in thread "main" java.lang.NoSuchMethodError: 'void androidx.compose.ui.graphics.SkiaBackedCanvas_skikoKt.setAlphaMultiplier(androidx.compose.ui.graphics.Canvas, float)'
at androidx.compose.ui.platform.RenderNodeLayer.performDrawLayer(RenderNodeLayer.skiko.kt:295)
at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.skiko.kt:244)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:348)
at androidx.compose.ui.node.LayoutNode.draw$ui(LayoutNode.kt:926)
at androidx.compose.ui.node.InnerNodeCoordinator.performDraw(InnerNodeCoordinator.kt:174)
at androidx.compose.ui.node.NodeCoordinator.drawContainedDrawModifiers(NodeCoordinator.kt:361)
at androidx.compose.ui.node.NodeCoordinator.draw(NodeCoordinator.kt:353)
at androidx.compose.ui.node.LayoutNode.draw$ui(LayoutNode.kt:926)
at androidx.compose.ui.node.RootNodeOwner.draw(RootNodeOwner.skiko.kt:197)
at androidx.compose.ui.scene.MultiLayerComposeSceneImpl.draw(MultiLayerComposeScene.skiko.kt:257)
at androidx.compose.ui.scene.BaseComposeScene.render(BaseComposeScene.skiko.kt:171)
at androidx.compose.ui.scene.ComposeSceneMediator.onRender(ComposeSceneMediator.desktop.kt:537)
at org.jetbrains.skiko.SkiaLayer.update$skiko(SkiaLayer.awt.kt:485)
at org.jetbrains.skiko.redrawer.AWTRedrawer.update(AWTRedrawer.kt:54)
at org.jetbrains.skiko.redrawer.LinuxOpenGLRedrawer.redrawImmediately(LinuxOpenGLRedrawer.kt:83)
at org.jetbrains.skiko.SkiaLayer.paint(SkiaLayer.awt.kt:325)
at androidx.compose.ui.scene.skia.WindowSkiaLayerComponent$contentComponent$1.paint(WindowSkiaLayerComponent.desktop.kt:54)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:955)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1124)
at java.desktop/javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
at java.desktop/javax.swing.JComponent.paintChildren(JComponent.java:955)
at java.desktop/javax.swing.JComponent.paint(JComponent.java:1124)
at androidx.compose.ui.window.Window_desktopKt$Window$12$1.invoke(Window.desktop.kt:434)
at androidx.compose.ui.window.Window_desktopKt$Window$12$1.invoke(Window.desktop.kt:419)
at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$3.invoke(AwtWindow.desktop.kt:78)
at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$3.invoke(AwtWindow.desktop.kt:76)
at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2$performUpdate$1.invoke(UpdateEffect.desktop.kt:59)
at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2$performUpdate$1.invoke(UpdateEffect.desktop.kt:55)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2304)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:504)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:260)
at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke$performUpdate(UpdateEffect.desktop.kt:55)
at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke(UpdateEffect.desktop.kt:64)
at androidx.compose.ui.util.UpdateEffect_desktopKt$UpdateEffect$2.invoke(UpdateEffect.desktop.kt:47)
at androidx.compose.runtime.DisposableEffectImpl.onRemembered(Effects.kt:82)
at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1295)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:984)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
at androidx.compose.runtime.Recomposer.composeInitial$runtime(Recomposer.kt:1099)
at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633)
at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619)
at androidx.compose.ui.window.Application_desktopKt$awaitApplication$2$1$2.invokeSuspend(Application.desktop.kt:221)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:102)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:792)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:739)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:733)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:761)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)
igordmn commented
It works on a simple project with:
Compose Multiplatform version: 1.6.10
Navigation Multiplatform version: 2.7.0-alpha07
Kotlin version: 2.0.0
Code:
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
@Composable
fun App() {
MaterialTheme {
val navController = rememberNavController()
Scaffold(
bottomBar = {
Row {
Button({
navController.navigate("Home")
}) {}
Button({
navController.navigate("Settings")
}) {}
}
}
) {
NavHost(
navController = navController,
startDestination = BottomBarScreen.Home.route
) {
composable(route = BottomBarScreen.Home.route) {
DisposableEffect(Unit) {
println("Home")
onDispose { }
}
}
composable(route = BottomBarScreen.Settings.route) {
DisposableEffect(Unit) {
println("Settings")
onDispose { }
}
}
}
}
}
}
sealed class BottomBarScreen(
val route: String,
) {
object Home: BottomBarScreen(
route = "Home",
)
object Settings: BottomBarScreen(
route = "Settings",
)
}
NoSuchMethodError
usually indicates there is a binary incompatibility, could you provide your project or just build.gradle
with the dependencies and gradle/lib.versions.toml
?
okushnikov commented
Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.