JetBrains/compose-multiplatform

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

Describe the bug
When I try to build and run Compose Desktop App in my Ubuntu 23.10, I have an error
image

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:

  1. 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()
             }
         }
  2. Run ./gradlew run

Expected behavior
Should not crash and show navigation bar like Android Target

Screenshots
image

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)

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?

Please check the following ticket on YouTrack for follow-ups to this issue. GitHub issues will be closed in the coming weeks.