Assigned
Status Update
Comments
ma...@gmail.com <ma...@gmail.com> #2
This actually has nothing to do with NavHostFragment, but is the behavior of NavController's setGraph().
When you call navController.setGraph(R.navigation.navigation_graph), it stores that ID and will restore that ID automatically.
If you were to instead use:
NavInflater navInflater = new NavInflater(this, navController.getNavigatorProvider());
navController.setGraph(navInflater.inflate(R.navigation.navigation_graph));
Then NavController would not restore the graph itself and the call to restoreState() you point out would only restore the back stack state, etc. but would wait for you to call setGraph again.
You're right that the inconsistency between the two setGraph methods is concerning. We'll take a look.
When you call navController.setGraph(R.navigation.navigation_graph), it stores that ID and will restore that ID automatically.
If you were to instead use:
NavInflater navInflater = new NavInflater(this, navController.getNavigatorProvider());
navController.setGraph(navInflater.inflate(R.navigation.navigation_graph));
Then NavController would not restore the graph itself and the call to restoreState() you point out would only restore the back stack state, etc. but would wait for you to call setGraph again.
You're right that the inconsistency between the two setGraph methods is concerning. We'll take a look.
gr...@google.com <gr...@google.com>
ah...@dubizzlelabs.com <ah...@dubizzlelabs.com> #3
Turns out, we already had a tracking bug for this issue, will follow up on that other one.
Description
Compiler: 1.5.15
Compose: 1.7.8
Material 3: 1.3.1
Kotlin version:
2.1.10
Steps to Reproduce or Code Sample to Reproduce:
Only seen in production, don't know how to reproduce.
realme RE549C (realme C31)
Android 13
Stack trace (if applicable):
```
Exception java.lang.IllegalStateException: Place was called on a node which was placed already
at androidx.compose.ui.internal.InlineClassHelperKt.throwIllegalStateException (InlineClassHelper.kt:26)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release (LayoutNodeLayoutDelegate.kt:2061)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-MLgxB_4 (LayoutNodeLayoutDelegate.kt:863)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeSelf-MLgxB_4 (LayoutNodeLayoutDelegate.kt:839)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno (LayoutNodeLayoutDelegate.kt:773)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno (Placeable.kt:35)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM (Placeable.kt:655)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default (Placeable.kt:390)
at androidx.compose.foundation.lazy.LazyListMeasuredItem.place (LazyListMeasuredItem.kt:241)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke (LazyListMeasure.kt:408)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke (LazyListMeasure.kt:405)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$Scope$layout$1.placeChildren (SubcomposeLayout.kt:923)
at androidx.compose.foundation.lazy.LazyListMeasureResult.placeChildren (LazyListMeasureResult.kt:3)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$2.placeChildren (SubcomposeLayout.kt:1015)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke (LayoutNodeLayoutDelegate.kt:429)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke (LayoutNodeLayoutDelegate.kt:424)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe (Snapshot.kt:503)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe (SnapshotStateObserver.kt:502)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads (SnapshotStateObserver.kt:258)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release (OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_release (OwnerSnapshotObserver.kt:83)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.layoutChildren (LayoutNodeLayoutDelegate.kt:457)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release (LayoutNodeLayoutDelegate.kt:627)
at androidx.compose.ui.node.InnerNodeCoordinator.onAfterPlaceAt (InnerNodeCoordinator.kt:182)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno (InnerNodeCoordinator.kt:169)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno (Placeable.kt:35)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer (Placeable.kt:646)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default (Placeable.kt:327)
at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier$measure$1.invoke (GraphicsLayerModifier.kt:648)
at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier$measure$1.invoke (GraphicsLayerModifier.kt:647)
at androidx.compose.ui.node.LookaheadCapablePlaceable$layout$1.placeChildren (LookaheadDelegate.kt:223)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.onAfterPlaceAt (LayoutModifierNodeCoordinator.kt:270)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno (LayoutModifierNodeCoordinator.kt:247)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno (Placeable.kt:35)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative (Placeable.kt:609)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative$default (Placeable.kt:232)
at androidx.compose.foundation.layout.FillNode$measure$1.invoke (Size.kt:704)
at androidx.compose.foundation.layout.FillNode$measure$1.invoke (Size.kt:703)
at androidx.compose.ui.node.LookaheadCapablePlaceable$layout$1.placeChildren (LookaheadDelegate.kt:223)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.onAfterPlaceAt (LayoutModifierNodeCoordinator.kt:270)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno (LayoutModifierNodeCoordinator.kt:247)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno (Placeable.kt:35)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50 (Placeable.kt:621)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke (LayoutNodeLayoutDelegate.kt:565)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke (LayoutNodeLayoutDelegate.kt:552)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe (Snapshot.kt:2441)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe (SnapshotStateObserver.kt:502)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads (SnapshotStateObserver.kt:258)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release (OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutModifierSnapshotReads$ui_release (OwnerSnapshotObserver.kt:98)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-MLgxB_4 (LayoutNodeLayoutDelegate.kt:871)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace (LayoutNodeLayoutDelegate.kt:889)
at androidx.compose.ui.node.LayoutNode.replace$ui_release (LayoutNode.kt:987)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded (MeasureAndLayoutDelegate.kt:576)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default (MeasureAndLayoutDelegate.kt:534)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout (MeasureAndLayoutDelegate.kt:390)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout (AndroidComposeView.android.kt:1268)
at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc (AndroidComposeView.android.kt:1855)
at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent (AndroidComposeView.android.kt:1829)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3189)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2832)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3189)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2832)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3189)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2832)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3189)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2832)
at com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:498)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1899)
at android.app.Activity.dispatchTouchEvent (Activity.java:4294)
at com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:456)
at android.view.View.dispatchPointerEvent (View.java:15298)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:6672)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:6470)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5912)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5970)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5936)
at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:6101)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:5944)
at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:6158)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5917)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5970)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5936)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:5944)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5917)
at android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:9058)
at android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:9009)
at android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:8976)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:9189)
at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:267)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents
at android.view.InputEventReceiver.consumeBatchedInputEvents (InputEventReceiver.java:247)
at android.view.ViewRootImpl.doConsumeBatchedInput (ViewRootImpl.java:9139)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run (ViewRootImpl.java:9283)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1234)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1242)
at android.view.Choreographer.doCallbacks (Choreographer.java:902)
at android.view.Choreographer.doFrame (Choreographer.java:827)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1217)
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:8061)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:703)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:923)
```