voyager icon indicating copy to clipboard operation
voyager copied to clipboard

IllegalStateException when close window on Compose Multiplatform for Desktop

Open Nyayurin opened this issue 1 year ago • 2 comments

image

Exception in thread "main" java.lang.IllegalStateException: State must be at least CREATED to move to DESTROYED, but was INITIALIZED in component cafe.adriel.voyager.jetpack.VoyagerLifecycleKMPOwner@25ea87c6
	at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.jvm.kt:131)
	at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.jvm.kt:124)
	at cafe.adriel.voyager.jetpack.VoyagerLifecycleKMPOwner.safeHandleLifecycleEvent(VoyagerLifecycleKMPOwner.kt:195)
	at cafe.adriel.voyager.jetpack.VoyagerLifecycleKMPOwner.onDispose(VoyagerLifecycleKMPOwner.kt:111)
	at cafe.adriel.voyager.jetpack.NavigatorLifecycleKMPOwner.onDispose(NavigatorLifecycleKMPOwner.kt:28)
	at cafe.adriel.voyager.navigator.lifecycle.NavigatorLifecycleStore.remove(NavigatorLifecycleStore.kt:41)
	at cafe.adriel.voyager.navigator.internal.NavigatorDisposableKt.disposeNavigator(NavigatorDisposable.kt:80)
	at cafe.adriel.voyager.navigator.internal.NavigatorDisposableKt$NavigatorDisposableEffect$1$invoke$$inlined$onDispose$1.dispose(Effects.kt:491)
	at cafe.adriel.voyager.core.lifecycle.DisposableEffectIgnoringConfigurationImpl.onForgotten(DisposableEffect.kt:71)
	at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1345)
	at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:787)
	at androidx.compose.ui.scene.BaseComposeScene.close(BaseComposeScene.skiko.kt:125)
	at androidx.compose.ui.scene.CanvasLayersComposeSceneImpl.close(CanvasLayersComposeScene.skiko.kt:194)
	at androidx.compose.ui.scene.ComposeSceneMediator.dispose(ComposeSceneMediator.desktop.kt:466)
	at androidx.compose.ui.scene.ComposeContainer.dispose(ComposeContainer.desktop.kt:199)
	at androidx.compose.ui.awt.ComposeWindowPanel.dispose(ComposeWindowPanel.desktop.kt:152)
	at androidx.compose.ui.awt.ComposeWindow.dispose(ComposeWindow.desktop.kt:164)
	at androidx.compose.ui.window.Window_desktopKt$Window$4$1.invoke(Window.desktop.kt:225)
	at androidx.compose.ui.window.Window_desktopKt$Window$4$1.invoke(Window.desktop.kt:221)
	at androidx.compose.ui.window.Window_desktopKt$Window$11$1.invoke(Window.desktop.kt:417)
	at androidx.compose.ui.window.Window_desktopKt$Window$11$1.invoke(Window.desktop.kt:416)
	at androidx.compose.ui.window.AwtWindow_desktopKt$AwtWindow$2$1$invoke$$inlined$onDispose$1.dispose(Effects.kt:491)
	at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:86)
	at androidx.compose.runtime.CompositionImpl$RememberEventDispatcher.dispatchRememberObservers(Composition.kt:1345)
	at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:992)
	at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1013)
	at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:678)
	at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:578)
	at androidx.compose.ui.window.YieldFrameClock.withFrameNanos(Application.desktop.kt:268)
	at androidx.compose.ui.window.YieldFrameClock$withFrameNanos$1.invokeSuspend(Application.desktop.kt)
	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)

dependencies: image image image

Nyayurin avatar Aug 21 '24 05:08 Nyayurin

I get a similar crash on Android after updating androidx.lifecycle:lifecycle-runtime-compose from 2.8.7 to 2.9.0. On 2.8.7 everything works fine, after updating to 2.9.0, it crashes with this:

 java.lang.IllegalStateException: State is 'DESTROYED' and cannot be moved to `STARTED` in component cafe.adriel.voyager.androidx.AndroidScreenLifecycleOwner@1ad5862
  at androidx.lifecycle.LifecycleRegistryKt.checkLifecycleStateTransition(LifecycleRegistry.kt:96)
  at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.jvm.kt:126)
  at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.jvm.kt:119)
  at cafe.adriel.voyager.androidx.AndroidScreenLifecycleOwner.emitOnStopEvents(AndroidScreenLifecycleOwner.kt:107)
  at cafe.adriel.voyager.androidx.AndroidScreenLifecycleOwner.access$emitOnStopEvents(AndroidScreenLifecycleOwner.kt:44)
  at cafe.adriel.voyager.androidx.AndroidScreenLifecycleOwner$LifecycleDisposableEffect$1$invoke$$inlined$onDispose$1.dispose(Effects.kt:490)
  at androidx.compose.runtime.DisposableEffectImpl.onForgotten(Effects.kt:87)
  at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberObservers(RememberEventDispatcher.kt:158)
  at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:1044)
  at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1067)
  at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:684)
  at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:591)
  at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:39)
  at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:108)
  at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
  at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1564)
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1575)
  at android.view.Choreographer.doCallbacks(Choreographer.java:1175)
  at android.view.Choreographer.doFrame(Choreographer.java:1100)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1549)
  at android.os.Handler.handleCallback(Handler.java:991)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loopOnce(Looper.java:232)
  at android.os.Looper.loop(Looper.java:317)
  at android.app.ActivityThread.main(ActivityThread.java:8973)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:591)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:927)
  Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@6fb61dc, androidx.compose.ui.platform.MotionDurationScaleImpl@d01e2e5, StandaloneCoroutine{Cancelling}@f0d91ba, AndroidUiDispatcher@b09e86b]

It crashes not at launch, but after I navigate to another screen.

acmpo6ou avatar May 25 '25 10:05 acmpo6ou

I also encountered the same problem on Android when exit app.

Caused by: java.lang.IllegalStateException: State must be at least 'CREATED' to be moved to 'DESTROYED' in component cafe.adriel.voyager.jetpack.VoyagerLifecycleKMPOwner@446dc87
                                                                                                    	at androidx.lifecycle.LifecycleRegistryKt.checkLifecycleStateTransition(LifecycleRegistry.kt:92)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.jvm.kt:126)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.jvm.kt:119)
                                                                                                    	at cafe.adriel.voyager.jetpack.VoyagerLifecycleKMPOwner.safeHandleLifecycleEvent(VoyagerLifecycleKMPOwner.kt:195)
                                                                                                    	at cafe.adriel.voyager.jetpack.VoyagerLifecycleKMPOwner.onDispose(VoyagerLifecycleKMPOwner.kt:111)
                                                                                                    	at cafe.adriel.voyager.jetpack.NavigatorLifecycleKMPOwner.onDispose(NavigatorLifecycleKMPOwner.kt:28)
                                                                                                    	at cafe.adriel.voyager.navigator.lifecycle.NavigatorLifecycleStore.remove(NavigatorLifecycleStore.kt:41)
                                                                                                    	at cafe.adriel.voyager.navigator.internal.NavigatorDisposableKt.disposeNavigator(NavigatorDisposable.kt:80)
                                                                                                    	at cafe.adriel.voyager.navigator.internal.NavigatorDisposableKt$NavigatorDisposableEffect$1$invoke$$inlined$onDispose$1.dispose(Effects.kt:498)
                                                                                                    	at cafe.adriel.voyager.core.lifecycle.DisposableEffectIgnoringConfigurationImpl.onForgotten(DisposableEffect.kt:71)
                                                                                                    	at androidx.compose.runtime.internal.RememberEventDispatcher.dispatchRememberObservers(RememberEventDispatcher.kt:158)
                                                                                                    	at androidx.compose.runtime.CompositionImpl.dispose(Composition.kt:843)
                                                                                                    	at androidx.compose.ui.platform.WrappedComposition.dispose(Wrapper.android.kt:154)
                                                                                                    	at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:165)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:313)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry.backwardPass(LifecycleRegistry.jvm.kt:266)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.jvm.kt:284)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.jvm.kt:135)
                                                                                                    	at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.jvm.kt:119)
                                                                                                    	at androidx.lifecycle.ReportFragment$Companion.dispatch$lifecycle_runtime_release(ReportFragment.android.kt:181)
                                                                                                    	at androidx.lifecycle.ReportFragment$LifecycleCallbacks.onActivityPreDestroyed(ReportFragment.android.kt:137)
                                                                                                    	at android.app.Activity.dispatchActivityPreDestroyed(Activity.java:1564)
                                                                                                    	at android.app.Activity.performDestroy(Activity.java:8423)
                                                                                                    	at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1345)
                                                                                                    	at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:5244)
                                                                                                    	at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:5288) 
                                                                                                    	at android.app.servertransaction.DestroyActivityItem.execute(DestroyActivityItem.java:44) 
                                                                                                    	at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
                                                                                                    	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                                                                    	at android.os.Looper.loop(Looper.java:236) 
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:8060) 
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 

jwslh avatar May 30 '25 14:05 jwslh