google / accompanist

A collection of extension libraries for Jetpack Compose
https://google.github.io/accompanist
Apache License 2.0
7.43k stars 598 forks source link

[Navigation Animation] NoSuchElementException: ArrayDeque is empty. #1558

Closed petin closed 1 year ago

petin commented 1 year ago

Description App is crashing when the same navigation is triggered too fast after each other - used version: 0.30.0

Steps to reproduce

Expected behavior Not crashing app

Additional context the crash does not occur when using the base androidx.navigation:navigation-compose only

    java.util.NoSuchElementException: ArrayDeque is empty.
        at kotlin.collections.ArrayDeque.removeLast(ArrayDeque.kt:163)
        at androidx.navigation.NavController.launchSingleTopInternal(NavController.kt:1850)
        at androidx.navigation.NavController.navigate(NavController.kt:1811)
        at androidx.navigation.NavController.navigate(NavController.kt:1774)
        at androidx.navigation.NavController.navigate(NavController.kt:2174)
        at androidx.navigation.NavController.navigate$default(NavController.kt:2169)
        at androidx.navigation.NavController.navigate(NavController.kt:2154)
        at com.test.MainActivity$onCreate$1$1$1$2$1.invoke(MainActivity.kt:129)
        ...
sanvean commented 1 year ago

Also seeing this upgrading an app from Jetpack Compose from 1.2.0 to 1.4.0.

Issue seems to have been introduced in v0.29.2-rc as using v.0.29.1-alpha and below works without issue.

gastsail commented 1 year ago

It happened to me recently too after executing this code

navController.navigate(NavigationScreens.ArbitrageScreen.route) {
                        popUpTo(NavigationScreens.LoginGraph.route) {
                            inclusive = true
                        }
                        launchSingleTop = true
                    }
starry-shivam commented 1 year ago

Same problem here when using

navController.navigate(screen.route) {
      popUpTo(navController.graph.findStartDestination().id)
      launchSingleTop = true
}

Logs:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.bitgapps.app, PID: 15248
    java.util.NoSuchElementException: ArrayDeque is empty.
        at kotlin.collections.ArrayDeque.removeLast(ArrayDeque.kt:163)
        at androidx.navigation.NavController.launchSingleTopInternal(NavController.kt:1848)
        at androidx.navigation.NavController.navigate(NavController.kt:1809)
        at androidx.navigation.NavController.navigate(NavController.kt:1772)
        at androidx.navigation.NavController.navigate(NavController.kt:2173)
        at androidx.navigation.NavController.navigate$default(NavController.kt:2168)
        at androidx.navigation.NavController.navigate(NavController.kt:2153)
        at com.bitgapps.app.ui.screens.MainScreenKt$BottomBar$3$1$1$1.invoke(MainScreen.kt:105)
        at com.bitgapps.app.ui.screens.MainScreenKt$BottomBar$3$1$1$1.invoke(MainScreen.kt:102)
        at androidx.compose.foundation.ClickableKt$clickable$4$gesture$1$1$2.invoke-k-4lQ0M(Clickable.kt:170)
        at androidx.compose.foundation.ClickableKt$clickable$4$gesture$1$1$2.invoke(Clickable.kt:159)
        at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapAndPress$2$1.invokeSuspend(TapGestureDetector.kt:255)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178)
        at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
        at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397)
        at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431)
        at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420)
        at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:328)
        at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:566)
        at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.dispatchPointerEvent(SuspendingPointerInputFilter.kt:456)
        at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:469)
        at androidx.compose.ui.node.BackwardsCompatNode.onPointerEvent-H0pRuoY(BackwardsCompatNode.kt:365)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:314)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301)
        at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:301)
        at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:183)
        at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:102)
        at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:98)
        at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1359)
        at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1311)
        at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1251)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2802)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2802)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2802)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2802)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2802)
E/AndroidRuntime:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2802)
        at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:500)
        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1905)
        at android.app.Activity.dispatchTouchEvent(Activity.java:4263)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:70)
        at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:458)
        at android.view.View.dispatchPointerEvent(View.java:15269)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6658)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6454)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5910)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5967)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5933)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6098)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5941)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6155)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5914)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5967)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5933)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5941)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5914)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8993)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8944)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8913)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9116)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:267)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:335)
        at android.os.Looper.loopOnce(Looper.java:161)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7913)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
        Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@d59395d, androidx.compose.runtime.BroadcastFrameClock@965f2d2, StandaloneCoroutine{Cancelling}@d08fa3, AndroidUiDispatcher@fa302a0]
I/Process: Sending signal. PID: 15248 SIG: 9
gastsail commented 1 year ago

So, for me if I comment my showSnackBar method which propagates a message to the MainActivity it will work, but if I leave the snackbar it will crash

Register Composable

is RegisterState.AccountCreated -> {
                showSnackbarMessage("Successfully registered.", false). --> Commenting this one does not crash the app
                onNavigateToMainScreen.invoke()
            }

AnimatedNavhost

AnimatedNavHost(...) {

composable(NavigationScreens.RegisterScreen.route) {
            RegisterScreen(modifier = Modifier.padding(vertical = 8.dp, horizontal = 8.dp),
                onNavigateToLoginScreen = {
                    navController.popBackStack()
                },
                onNavigateToMainScreen = {
                    navController.navigate(NavigationScreens.ArbitrageScreen.route) {
                        popUpTo(NavigationScreens.LoginGraph.route) {
                            inclusive = true
                        }
                        launchSingleTop = true
                    }
                },
                showSnackbarMessage = { message, isError ->
                    showSnackBarMessage(message, isError)
                })
        }
}

MainActivity

  val scaffoldState: ScaffoldState = rememberScaffoldState()
            val navigationController by rememberUpdatedState(newValue = rememberAnimatedNavController())
            var snackBarMessage: String? by remember { mutableStateOf(null) }
            var isError by remember { mutableStateOf(false) }

            CryptoTheme {
                Scaffold(
                    scaffoldState = scaffoldState,
                    snackbarHost = {
                        SnackbarHost(hostState = it) { data ->
                            Snackbar(
                                snackbarData = data,
                                backgroundColor = if(!isError) GreenProfit else Color.Red,
                                contentColor = Color.White
                            )
                        }
                    },
                    bottomBar = { BottomBarNavigation(navController = navigationController) },
                    backgroundColor = Color.Black
                ) {
                    NavigationGraph(
                        modifier = Modifier.padding(bottom = it.calculateBottomPadding()),
                        navController = navigationController,
                        showSnackBarMessage = { message, showError ->
                            isError = showError
                            snackBarMessage = message
                        }
                    )

                    LaunchedEffect(key1 = snackBarMessage) {
                        if(snackBarMessage != null) {
                            scaffoldState.snackbarHostState.showSnackbar(
                                message = snackBarMessage ?: ""
                            )
                            snackBarMessage = null
                        }
                    }
                }
            }
        }

Log

java.util.NoSuchElementException: ArrayDeque is empty.
                                                                                                        at kotlin.collections.ArrayDeque.removeLast(ArrayDeque.kt:163)
                                                                                                        at androidx.navigation.NavController.launchSingleTopInternal(NavController.kt:1850)
                                                                                                        at androidx.navigation.NavController.navigate(NavController.kt:1811)
                                                                                                        at androidx.navigation.NavController.navigate(NavController.kt:1774)
                                                                                                        at androidx.navigation.NavController.navigate(NavController.kt:2174)
                                                                                                        at androidx.navigation.NavController.navigate$default(NavController.kt:2169)
                                                                                                        at androidx.navigation.NavController.navigate(NavController.kt:2154)
                                                                                                        at com.coinpeeker.navigation.NavigationGraphKt$loginGraph$3$2$2.invoke(NavigationGraph.kt:130)
                                                                                                        at com.coinpeeker.navigation.NavigationGraphKt$loginGraph$3$2$2.invoke(NavigationGraph.kt:125)
                                                                                                        at com.coinpeeker.screens.RegisterScreenKt.RegisterScreen(RegisterScreen.kt:93)
                                                                                                        at com.coinpeeker.navigation.NavigationGraphKt$loginGraph$3$2.invoke(NavigationGraph.kt:125)
                                                                                                        at com.coinpeeker.navigation.NavigationGraphKt$loginGraph$3$2.invoke(NavigationGraph.kt:124)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:135)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                                                                                                        at com.google.accompanist.navigation.animation.AnimatedNavHostKt$AnimatedNavHost$9$1.invoke(AnimatedNavHost.kt:225)
                                                                                                        at com.google.accompanist.navigation.animation.AnimatedNavHostKt$AnimatedNavHost$9$1.invoke(AnimatedNavHost.kt:223)
                                                                                                        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 androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52)
                                                                                                        at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
                                                                                                        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.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
                                                                                                        at com.google.accompanist.navigation.animation.AnimatedNavHostKt$AnimatedNavHost$9.invoke(AnimatedNavHost.kt:223)
                                                                                                        at com.google.accompanist.navigation.animation.AnimatedNavHostKt$AnimatedNavHost$9.invoke(AnimatedNavHost.kt:211)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:135)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$7$1$4.invoke(AnimatedContent.kt:701)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$7$1$4.invoke(AnimatedContent.kt:691)
                                                                                                        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.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:939)
                                                                                                        at androidx.compose.animation.AnimatedVisibilityKt.access$AnimatedEnterExitImpl(AnimatedVisibility.kt:1)
                                                                                                        at androidx.compose.animation.AnimatedVisibilityKt$AnimatedEnterExitImpl$2.invoke(Unknown Source:17)
                                                                                                        at androidx.compose.animation.AnimatedVisibilityKt$AnimatedEnterExitImpl$2.invoke(Unknown Source:10)
2023-04-01 00:55:39.584 19714-19714 AndroidRuntime          com.coinpeeker                       E      at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:162)
                                                                                                        at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2465)
                                                                                                        at androidx.compose.runtime.ComposerImpl.skipToGroupEnd(Composer.kt:2756)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$7$1.invoke(AnimatedContent.kt:702)
                                                                                                        at androidx.compose.animation.AnimatedContentKt$AnimatedContent$7$1.invoke(AnimatedContent.kt:664)
                                                                                                        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.animation.AnimatedContentKt.AnimatedContent(AnimatedContent.kt:714)
                                                                                                        at com.google.accompanist.navigation.animation.AnimatedNavHostKt.AnimatedNavHost(AnimatedNavHost.kt:196)
                                                                                                        at com.google.accompanist.navigation.animation.AnimatedNavHostKt.AnimatedNavHost(AnimatedNavHost.kt:89)
                                                                                                        at com.coinpeeker.navigation.NavigationGraphKt.NavigationGraph(NavigationGraph.kt:41)
                                                                                                        at com.coinpeeker.ComposableSingletons$MainActivityKt$lambda-1$1$1$3.invoke(MainActivity.kt:61)
                                                                                                        at com.coinpeeker.ComposableSingletons$MainActivityKt$lambda-1$1$1$3.invoke(MainActivity.kt:60)
                                                                                                        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.material.ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1.invoke(Scaffold.kt:322)
                                                                                                        at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1.invoke(Scaffold.kt:320)
                                                                                                        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.ui.layout.LayoutNodeSubcompositionsState$subcompose$3$1$1.invoke(SubcomposeLayout.kt:778)
                                                                                                        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$subcompose$3$1$1.invoke(SubcomposeLayout.kt:446)
                                                                                                        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$doCompose$2$5.invoke(Composer.kt:3352)
                                                                                                        at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3342)
                                                                                                        at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
                                                                                                        at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1)
                                                                                                        at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3342)
                                                                                                        at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:3277)
                                                                                                        at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:587)
                                                                                                        at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:966)
                                                                                                        at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3952)
                                                                                                        at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:519)
                                                                                                        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcomposeInto(SubcomposeLayout.kt:466)
                                                                                                        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:439)
                                                                                                        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:430)
                                                                                                        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:419)
                                                                                                        at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$Scope.subcompose(SubcomposeLayout.kt:740)
                                                                                                        at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1.invoke(Scaffold.kt:320)
                                                                                                        at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1.invoke(Scaffold.kt:243)
                                                                                                        at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
2023-04-01 00:55:39.584 19714-19714 AndroidRuntime          com.coinpeeker                       E      at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure$1.placeChildren(SubcomposeLayout.kt:610)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:276)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:268)
                                                                                                        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2200)
                                                                                                        at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:234)
                                                                                                        at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:230)
                                                                                                        at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
                                                                                                        at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1)
                                                                                                        at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
                                                                                                        at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:120)
                                                                                                        at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_release(OwnerSnapshotObserver.kt:77)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.layoutChildren(LayoutNodeLayoutDelegate.kt:268)
                                                                                                        at androidx.compose.ui.node.LayoutNode.onNodePlaced$ui_release(LayoutNode.kt:955)
                                                                                                        at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:137)
                                                                                                        at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:35)
                                                                                                        at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:445)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:451)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:445)
                                                                                                        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2200)
                                                                                                        at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:234)
                                                                                                        at androidx.compose.runtime.snapshots.SnapshotStateObserver$observeReads$1$1.invoke(SnapshotStateObserver.kt:230)
                                                                                                        at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
                                                                                                        at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1)
                                                                                                        at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
                                                                                                        at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:120)
                                                                                                        at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutModifierSnapshotReads$ui_release(OwnerSnapshotObserver.kt:92)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:445)
                                                                                                        at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace(LayoutNodeLayoutDelegate.kt:466)
                                                                                                        at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:843)
                                                                                                        at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:445)
                                                                                                        at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:39)
                                                                                                        at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:330)
                                                                                                        at androidx.compose.ui.platform.AndroidComposeView.onLayout(AndroidComposeView.android.kt:905)
                                                                                                        at android.view.View.layout(View.java:23693)
                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:6413)
                                                                                                        at androidx.compose.ui.platform.AbstractComposeView.internalOnLayout$ui_release(ComposeView.android.kt:322)
                                                                                                        at androidx.compose.ui.platform.AbstractComposeView.onLayout(ComposeView.android.kt:313)
                                                                                                        at android.view.View.layout(View.java:23693)
2023-04-01 00:55:39.584 19714-19714 AndroidRuntime          com.coinpeeker                       E      at android.view.ViewGroup.layout(ViewGroup.java:6413)
                                                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
                                                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
                                                                                                        at android.view.View.layout(View.java:23693)
                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:6413)
                                                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
                                                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
                                                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
                                                                                                        at android.view.View.layout(View.java:23693)
                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:6413)
                                                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
                                                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
                                                                                                        at com.android.internal.policy.DecorView.onLayout(DecorView.java:799)
                                                                                                        at android.view.View.layout(View.java:23693)
                                                                                                        at android.view.ViewGroup.layout(ViewGroup.java:6413)
                                                                                                        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3999)
                                                                                                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3372)
                                                                                                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2328)
                                                                                                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9087)
                                                                                                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
                                                                                                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
                                                                                                        at android.view.Choreographer.doCallbacks(Choreographer.java:899)
                                                                                                        at android.view.Choreographer.doFrame(Choreographer.java:832)
                                                                                                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:942)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7872)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Error is happening on line

onNavigateToMainScreen = {
                    navController.navigate(NavigationScreens.ArbitrageScreen.route) {
                        popUpTo(NavigationScreens.LoginGraph.route) {
                            inclusive = true
                        }
                        launchSingleTop = true
                    }
                }

But seems like disabling the snackbar does not have this issue 🤔

This is happening in version 0.30.0

EDIT: Seems like if I remove launchSingleTop = true from the navigation to my main screen the error does not happen.

wiyarmir commented 1 year ago

for the ones having the same issue, it has been fixed and merged, we have to wait for the 2.6.0-alpha09 release of navigation-compose (hopefully this week or next)

Kagiri11 commented 1 year ago

@wiyarmir Thank you.

jbw0033 commented 1 year ago

As stated in this comment, it has been fixed in the upcoming release of Navigation. Closing this bug.

sherwinzadeh commented 1 year ago

Removing launchSingleTop = true fixed it for me

ssSFrankSss commented 1 year ago

The problem appears when you click second time the same route while having launchSingleTop = true. so by doing this you will got the issue resolved most probably:

    if (navController.currentDestination?.route.equals(newRoute)) return@Drawer
    navController.navigate(route) {
        launchSingleTop = true
    }
dkexception commented 1 year ago

This launchSingleTop = true issue still exists even in version 2.7.1 of navigation-compose - https://issuetracker.google.com/issues/294408596.

As a workaround, if we remove single top behaviour, multiple instances get added to the backstack and bottom navigation becomes a mess!

Converting navigation() elements to composable() element in the NavHost solved this for me! But this way navigation graph is not achievable with multiple destinations!