When I add animation to the children navigation, a...
# decompose
a
When I add animation to the children navigation, application starts crashing.
Copy code
Children(
    stack = rootComponent.childStack,
    animation = stackAnimation(fade() + scale())
) {
}
java.lang.IllegalStateException: InstanceKeeper is destroyed
Working fine with
2.1.0-alpha-02
a
Glad that it's fixed already. Wondering how it is related to animations? Could you a stack trace?
a
Copy code
22:14:58.005  E  FATAL EXCEPTION: main
                 Process: com.example.musicapp_kmp.android, PID: 5556
                 java.lang.IllegalStateException: InstanceKeeper is destroyed
                 	at com.arkivanov.essenty.instancekeeper.DefaultInstanceKeeperDispatcher.checkIsNotDestroyed(DefaultInstanceKeeperDispatcher.kt:40)
                 	at com.arkivanov.essenty.instancekeeper.DefaultInstanceKeeperDispatcher.get(DefaultInstanceKeeperDispatcher.kt:16)
                 	at com.example.musicapp_kmp.decompose.ChartDetailsComponentImpl.getViewModel(ChartDetailsComponentImpl.kt:36)
                 	at com.example.musicapp_kmp.chartdetails.ChartDetailsKt.ChartDetailsScreen(ChartDetails.kt:40)
                 	at com.example.musicapp_kmp.Main_commonKt$MainCommon$1$1$1$1.invoke(main.common.kt:48)
                 	at com.example.musicapp_kmp.Main_commonKt$MainCommon$1$1$1$1.invoke(main.common.kt:35)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                 	at com.arkivanov.decompose.extensions.compose.jetbrains.stack.ChildrenKt$Children$1$1.invoke(Children.kt:31)
                 	at com.arkivanov.decompose.extensions.compose.jetbrains.stack.ChildrenKt$Children$1$1.invoke(Children.kt:30)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                 	at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
                 	at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
                 	at com.arkivanov.decompose.extensions.compose.jetbrains.stack.ChildrenKt$Children$1.invoke(Children.kt:30)
                 	at com.arkivanov.decompose.extensions.compose.jetbrains.stack.ChildrenKt$Children$1.invoke(Children.kt:29)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                 	at com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.DefaultStackAnimation$Item$childContent$1$1.invoke(DefaultStackAnimation.kt:71)
                 	at com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.DefaultStackAnimation$Item$childContent$1$1.invoke(DefaultStackAnimation.kt:69)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                 	at androidx.compose.runtime.ComposerImpl$invokeMovableContentLambda$1.invoke(Composer.kt:2849)
                 	at androidx.compose.runtime.ComposerImpl$invokeMovableContentLambda$1.invoke(Composer.kt:2849)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
                 	at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                 	at androidx.compose.runtime.ActualJvm_jvmKt.invokeComposable(ActualJvm.jvm.kt:78)
                 	at androidx.compose.runtime.ComposerImpl.invokeMovableContentLambda(Composer.kt:2849)
                 	at androidx.compose.runtime.ComposerImpl.access$invokeMovableContentLambda(Composer.kt:1173)
                 	at androidx.compose.runtime.ComposerImpl$insertMovableContentGuarded$1$1$5$1$1$1.invoke(Composer.kt:3060)
                 	at androidx.compose.runtime.ComposerImpl$insertMovableContentGuarded$1$1$5$1$1$1.invoke(Composer.kt:3054)
                 	at androidx.compose.runtime.CompositionImpl.delegateInvalidations(Composition.kt:925)
                 	at androidx.compose.runtime.ComposerImpl.recomposeMovableContent(Composer.kt:3138)
                 	at androidx.compose.runtime.ComposerImpl.insertMovableContentGuarded(Composer.kt:3054)
                 	at androidx.compose.runtime.ComposerImpl.insertMovableContentReferences(Composer.kt:2866)
                 	at androidx.compose.runtime.CompositionImpl.insertMovableContent(Composition.kt:784)
                 	at androidx.compose.runtime.Recomposer.performInsertValues(Recomposer.kt:1052)
                 	at androidx.compose.runtime.Recomposer.access$performInsertValues(Recomposer.kt:125)
22:14:58.005  E  	at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:567)
                 	at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:503)
                 	at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
                 	at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
                 	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:970)
                 	at android.view.Choreographer.doCallbacks(Choreographer.java:796)
                 	at android.view.Choreographer.doFrame(Choreographer.java:727)
                 	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
                 	at android.os.Handler.handleCallback(Handler.java:938)
                 	at android.os.Handler.dispatchMessage(Handler.java:99)
                 	at android.os.Looper.loop(Looper.java:223)
                 	at android.app.ActivityThread.main(ActivityThread.java:7656)
                 	at java.lang.reflect.Method.invoke(Native Method)
                 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
                 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
                 	Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@39803ed, androidx.compose.ui.platform.MotionDurationScaleImpl@f3a1222, StandaloneCoroutine{Cancelling}@58c44b3, AndroidUiDispatcher@f19fa70]
a
Thanks! It's still not clear how that fix actually fixes the issue in your specific case. If I understand it correctly, your Composable function accesses the view model via InstanceKeeper. When you use animations, this call may happen during or after the final transition out of the screen, when the component is already destroyed. That fix only changes the order in which components and their retained instances are destroyed. E.g. before that, if you access InstanceKeeper in onDestroy, then InstanceKeeper could be already destroyed, and you get that crash. Now it won't be destroyed yet. But in your case, it seems like another story. Anyway, it's advised to store the retained instance in a property, not take it from InstanceKeeper every time. Because the component could be potentially accessed after onDestroy.