voyager
voyager copied to clipboard
IllegalStateException when close window on Compose Multiplatform for Desktop
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:
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.
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)Â