Status Update
Comments
ro...@gmail.com <ro...@gmail.com> #2
I'm getting the same error today
ti...@google.com <ti...@google.com> #3
Any chance you could provide a way to repro this crash?
ti...@google.com <ti...@google.com> #4
Andrey, could you verify if this is the same root cause as
BTW, the question in #3 was meant for folks who made
ro...@gmail.com <ro...@gmail.com> #5
to...@gmail.com <to...@gmail.com> #6
I have a way to repro inside my app but not yet fully back to try to extract something I can share.
I just quickly tested latest SNAPSHOT (10683443) and now the error is different and requires a lot more scrolls to trigger.
java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(LayoutNode.kt:1458)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:697)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:681)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.LazyListMeasuredItem.place(LazyListMeasuredItem.kt:182)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:352)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:349)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.LazyListMeasureResult.placeChildren(Unknown Source:2)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:379)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:371)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:473)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
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:371)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:515)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:587)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:576)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:569)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
14:54:13.754 AndroidRuntime app.symfonik.music.player.debug E at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:709)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:473)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:230)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace(LayoutNodeLayoutDelegate.kt:730)
at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:917)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout-0kLqBqw(MeasureAndLayoutDelegate.kt:426)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout-0kLqBqw(AndroidComposeView.android.kt:920)
at androidx.compose.ui.node.LayoutNode.forceRemeasure(LayoutNode.kt:1221)
at androidx.compose.foundation.lazy.LazyListState.snapToItemIndexInternal$foundation_release(LazyListState.kt:271)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invokeSuspend(LazyListState.kt:263)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invoke(Unknown Source:8)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invoke(Unknown Source:4)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2$1.invokeSuspend(ScrollableState.kt:181)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2$1.invoke(Unknown Source:8)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2$1.invoke(Unknown Source:4)
at androidx.compose.foundation.MutatorMutex$mutateWith$2.invokeSuspend(MutatorMutex.kt:173)
at androidx.compose.foundation.MutatorMutex$mutateWith$2.invoke(Unknown Source:8)
at androidx.compose.foundation.MutatorMutex$mutateWith$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
at androidx.compose.foundation.MutatorMutex.mutateWith(MutatorMutex.kt:166)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2.invokeSuspend(ScrollableState.kt:178)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2.invoke(Unknown Source:8)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
14:54:13.755 AndroidRuntime app.symfonik.music.player.debug E at androidx.compose.foundation.gestures.DefaultScrollableState.scroll(ScrollableState.kt:177)
at androidx.compose.foundation.lazy.LazyListState.scroll(LazyListState.kt:287)
at androidx.compose.foundation.gestures.ScrollableState.scroll$default(ScrollableState.kt:53)
at androidx.compose.foundation.lazy.LazyListState.scrollToItem(LazyListState.kt:262)
at app.symfonik.core.ui.common.lazylist.LazyColumnScrollbarKt$LazyColumnScrollbar$setScrollOffset$1.invokeSuspend(LazyColumnScrollbar.kt:164)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:68)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:827)
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:7918)
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)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@379b64b, androidx.compose.runtime.BroadcastFrameClock@95fa828, StandaloneCoroutine{Cancelling}@9e6f941, AndroidUiDispatcher@901ee6]
And for my case, this is an 1.6 A3 issue, reverting to 1.6 A2 (And M3 to 1.2 A4) does fix this at 100%
ti...@google.com <ti...@google.com> #7
I just quickly tested latest SNAPSHOT (10683443) and now the error is different and requires a lot more scrolls to trigger.
Thanks for verifying. The snapshot above contains our fix for placement that affected lookahead. Given that the issue is a lot more difficult to trigger, it's likely the result of the fix. The new stacktrace seems like a different issue.
Andrey, could you take a look at the stacktrace in
an...@google.com <an...@google.com> #8
The original stacktrace which has "forceMeasureTheSubtree" in it is the one fixed by aosp/2698053 which should be a part of the next alpha. However the new one "LayoutNode should be attached to an owner" is something new and I don't have immediate ideas what it can be related to. We will need a way to reproduce it, maybe you can try to come up with a sample project?
to...@gmail.com <to...@gmail.com> #9
Since it will still crash in A4 for my app, I'm reverting to A2 and a little out of delay so lack time this week to try to extract a repro that will probably be complicated as only crashing in a specific screen.
I can still add some logs / test things if you have idea to gain time on this. (Like what I could remove from that screen to pinpoint,...)
an...@google.com <an...@google.com> #10
First please try to test if it is related to lookahead. If you remove a LookaheadScope will it still crash? Then "LayoutNode should be attached to an owner" naturally can mean trying to scroll a state associated with an already disposed lazy list. I see that the scroll itself happens from some Scrollbars coroutine scope. Maybe the scrollbar lives longer than the list itself?
to...@gmail.com <to...@gmail.com> #11
I do not on purpose use LookaheadScope anywhere in my code yet. Waiting for an official shared transition stuff for that.
I do not think it's possible for the scrollbar to outlive the lazylist and there's no way to trigger a crash in 1.6 A2 or before. Is there a way to detect this on the scrolling call side so that I can prevent this?
an...@google.com <an...@google.com> #12
I don't yet understand what exactly is happening here so I don't know how to detect or workaround it. I am also not sure how to figure out what is the issue here without being able to reproduce it on my end unfortunately
to...@gmail.com <to...@gmail.com> #13
Well I'll see what I can do on my side but it's still an A3/A4 regression.
Compose internal debugging is quite hard for random guys like me :p
to...@gmail.com <to...@gmail.com> #14
So did a stupid random test with a try/catch over the scroll calls.
This leads to another crash maybe it have info in it?
Exception dispatching input event.
20:31:21.384 MessageQueue-JNI app.symfonik.music.player.debug E Exception in MessageQueue callback: handleReceiveCallback
20:31:21.386 MessageQueue-JNI app.symfonik.music.player.debug E java.lang.IllegalStateException: visitLocalDescendants called on an unattached node
at androidx.compose.ui.node.NodeCoordinator.shouldSharePointerInputWithSiblings(NodeCoordinator.kt:1685)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:222)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:595)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:599)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:597)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:597)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:546)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:595)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:599)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:597)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:597)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:599)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:597)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:597)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:546)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:595)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:599)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:597)
20:31:21.386 MessageQueue-JNI app.symfonik.music.player.debug E at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:597)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:546)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
20:31:21.386 MessageQueue-JNI app.symfonik.music.player.debug E at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:595)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:599)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:597)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:597)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:546)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
20:31:21.386 MessageQueue-JNI app.symfonik.music.player.debug E at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:695)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.kt:1235)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:543)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release$default(LayoutNode.kt:944)
at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:99)
at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1496)
at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1447)
at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1387)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2745)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2745)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2745)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3121)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2745)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:500)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1912)
at android.app.Activity.dispatchTouchEvent(Activity.java:4299)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:458)
at android.view.View.dispatchPointerEvent(View.java:15309)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6778)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6578)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6034)
20:31:21.386 MessageQueue-JNI app.symfonik.music.player.debug E at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6091)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6057)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6222)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6065)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6279)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6038)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6091)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6057)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6065)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6038)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9206)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9157)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9126)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9329)
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:7918)
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)
Seems to occur when I fast scroll and let press and move over the navigation bar (gesture mode on pixel), but relatively rare.
an...@google.com <an...@google.com> #15
Is an item inside this scrollable list some instance of SubcomposeLayout as well? For example LazyRow inside a LazyColumn, or maybe BoxWithConstraints. If yes, can you reproduce it when there is no extra Subcomposition inside it?
to...@gmail.com <to...@gmail.com> #16
No I've removed everything and there's nothing inside the LazyList that is Subcompose.
Only the scrollbar that is outside is a BoxWithConstraints
I can even reproduce the last crash with Box (modifier = Modifier.size(80.dp).fillMaxWidth())
as the items.
The only difference I can spot in that screen from the others is that I use:
itemsIndexed(items = playlistEntriesItems, key = { _, item -> item.id }) { index, item ->
And in the other screen that I can't make crash it's all
items(
count = lazyPagingItems.itemCount,
key = lazyPagingItems.itemKey { it.id },
contentType = lazyPagingItems.itemContentType(),
) { index ->
Can't test more for now, will see if I can extract something end of week or early next week if you have no more ideas :(
ti...@google.com <ti...@google.com> #17
I was able to repro the crash java.lang.IllegalStateException: LayoutNode should be attached to an owner
with the following test:
@Test
fun forceMeasureLookaheadRootInParentsMeasurePass() {
var size by mutableStateOf(200f)
rule.setContent {
// Mutate this state in measure
var show by remember { mutableStateOf(true) }
Box(Modifier.fillMaxSize()) {
LazyColumn(Modifier.layout { measurable, _ ->
// Mutate this state in measure. This state will later be used in descendant's
// composition.
show = size > 300
measurable.measure(Constraints.fixed(size.toInt(), size.toInt())).run {
layout(width, height) { place(0, 0) }
}
}) {
item {
SubcomposeLayout(Modifier.fillMaxSize()) {
val placeable = subcompose(Unit) {
// read the value to force a recomposition
Box(
Modifier.requiredSize(222.dp)
) {
AnimatedContent(show, Modifier.requiredSize(200.dp)) {
if (it) {
Row(Modifier.fillMaxSize()) {}
} else {
Row(
Modifier.size(10.dp)
) {}
}
}
}
// Measure with the same constraints to ensure the child (i.e. Box)
// gets no constraints change and hence starts forceMeasureSubtree
// from there
}[0].measure(Constraints(0, 2000, 0, 2000))
layout(700, 800) {
placeable.place(0, 0)
}
}
}
}
}
}
rule.runOnIdle { size = 600f - size }
rule.runOnIdle { size = 600f - size }
}
an...@google.com <an...@google.com> #18
Doris, thanks for your repro. What I see is that this tests is not crashing anymore after the cl you merged yesterday -
Tolriq, could you please re-test with the latest SNAPSHOT? Do you have AnimatedContent
somewhere on this screen? It introduces a LookaheadScope under the hood
to...@gmail.com <to...@gmail.com> #19
I had some AnimatedVisibility
but no more in the test with no actual content.
I've made some more tests to try to figure out why it was only happening on some screen and not others that looked similar and found the difference.
The crashing screens are LazyColumn
surrounded by attached LazyColumnScrollbar
The working screens are LazyVerticalGrid
surrounded by attached LazyGridScrollbar
I can't spot the difference between those 2 files that could trigger such issue, but I've migrated all to LazyGrid as it was an oversight and reduced duplicated code and there's no more crashes.
The LazyColumnScrollbar triggered the #6 crash when untouched (so as attached), and then the #14 when I try catch the 2 scroll calls in it.
to...@gmail.com <to...@gmail.com> #20
And sorry but since triage in Compose is always random, just found a new high performance impact issue
to...@gmail.com <to...@gmail.com> #21
After more debugging of
Doris maybe you can have a look as it's maybe not an issue for Nader after all.
an...@google.com <an...@google.com> #22
Unfortunately I can't reproduce it on the latest main. What I tried is some combinations similar to
val state = rememberLazyListState()
LazyColumnScrollbar(state, content = {
LazyColumn(state = state, modifier = Modifier.fillMaxSize()) {
items(1000) {
AnimatedVisibility(true) {
Text("Item $it", Modifier.padding(30.dp))
}
}
}
})
Are you sure this issue is still reproducible with the latest snapshot?
to...@gmail.com <to...@gmail.com> #23
I'll need to triple check but yes.
To repro you need to drag the scrollbar drag handle fast and moving over the system nav bar (gesture or not) can require a few tries.
to...@gmail.com <to...@gmail.com> #24
So took 20 minutes thanks to ultra slow snapshot server :(
Just tested again with 10716698 and it's still present (And still no issue on the similar screens with LazyXXGrid)
I've attached a video with touches visible.
java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(LayoutNode.kt:1458)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:697)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:681)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.LazyListMeasuredItem.place(LazyListMeasuredItem.kt:182)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:352)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:349)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.LazyListMeasureResult.placeChildren(Unknown Source:2)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:379)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:371)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:371)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:515)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:587)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:576)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:569)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
17:33:24.849 Crash app.symfonik.music.player.debug E at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:709)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace(LayoutNodeLayoutDelegate.kt:730)
at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:917)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout-0kLqBqw(MeasureAndLayoutDelegate.kt:414)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout-0kLqBqw(AndroidComposeView.android.kt:948)
at androidx.compose.ui.node.LayoutNode.forceRemeasure(LayoutNode.kt:1221)
at androidx.compose.foundation.lazy.LazyListState.snapToItemIndexInternal$foundation_release(LazyListState.kt:271)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invokeSuspend(LazyListState.kt:263)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invoke(Unknown Source:8)
at androidx.compose.foundation.lazy.LazyListState$scrollToItem$2.invoke(Unknown Source:4)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2$1.invokeSuspend(ScrollableState.kt:181)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2$1.invoke(Unknown Source:8)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2$1.invoke(Unknown Source:4)
at androidx.compose.foundation.MutatorMutex$mutateWith$2.invokeSuspend(MutatorMutex.kt:173)
at androidx.compose.foundation.MutatorMutex$mutateWith$2.invoke(Unknown Source:8)
at androidx.compose.foundation.MutatorMutex$mutateWith$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
at androidx.compose.foundation.MutatorMutex.mutateWith(MutatorMutex.kt:166)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2.invokeSuspend(ScrollableState.kt:178)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2.invoke(Unknown Source:8)
at androidx.compose.foundation.gestures.DefaultScrollableState$scroll$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
17:33:24.851 Crash app.symfonik.music.player.debug E at androidx.compose.foundation.gestures.DefaultScrollableState.scroll(ScrollableState.kt:177)
at androidx.compose.foundation.lazy.LazyListState.scroll(LazyListState.kt:287)
at androidx.compose.foundation.gestures.ScrollableState.scroll$default(ScrollableState.kt:53)
at androidx.compose.foundation.lazy.LazyListState.scrollToItem(LazyListState.kt:262)
at app.symfonik.core.ui.common.lazylist.LazyColumnScrollbarKt$LazyColumnScrollbar$setScrollOffset$1.invokeSuspend(LazyColumnScrollbar.kt:165)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:68)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:827)
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:7918)
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)
And still the same side effect, If I catch the 2 scroll calls, then the crash becomes #12.
to...@gmail.com <to...@gmail.com> #25
Adding a note that it occurs with different kind of content one of the simpler would be:
LazyColumnScrollbar(
lazyListState,
modifier = Modifier
.statusBarsPadding(),
thickness = 8.dp,
thumbColor = MaterialTheme.colorScheme.primary,
thumbSelectedColor = MaterialTheme.colorScheme.primary.darken(1.15f),
scrollListener = {
topButtonBarState.onManualScrollDirection(direction = it)
},
content = {
LazyColumn(
state = lazyListState,
) {
item {
MediumTopAppBar(
title = {
Row(verticalAlignment = CenterVertically) {
Icon(imageVector = SymfoniumIcons.Rounded.Folder, contentDescription = null, modifier = Modifier.padding(horizontal = 8.dp))
Text(
viewModel.getCurrentFolderName(),
modifier = Modifier.padding(horizontal = 8.dp),
style = MaterialTheme.typography.titleMedium,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
)
}
},
navigationIcon = {
Icon(
imageVector = SymfoniumIcons.Rounded.ArrowBack,
contentDescription = null,
modifier = Modifier
.clickable {
navigator.goBack()
}
.padding(horizontal = 8.dp),
)
},
windowInsets = WindowInsets(0, 0, 0, 0),
modifier = Modifier
.statusBarsPadding()
.padding(horizontal = 8.dp),
colors = TopAppBarDefaults.mediumTopAppBarColors(containerColor = Color.Transparent),
)
HorizontalDivider(modifier = Modifier.padding(horizontal = 16.dp), color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.38f))
Spacer(modifier = Modifier.height(8.dp))
}
item {
AnimatedVisibility(
visible = searchBarVisible,
modifier = Modifier.fillMaxWidth(),
enter = fadeIn() + expandIn(expandFrom = Alignment.BottomCenter),
exit = fadeOut() + shrinkOut(shrinkTowards = Alignment.BottomCenter),
) {
SearchBar(
query = state.query,
onQueryChange = {
state.query = it
viewModel.updateTextFilter(it.text)
},
onSearchFocusChange = {
state.focused = it
},
onClearQuery = {
state.query = TextFieldValue("")
viewModel.updateTextFilter("")
},
searching = state.searching,
focused = state.focused,
hint = stringResource(id = R.string.filter),
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
)
}
}
item {
val sort by viewModel.sortOrder.collectAsStateBlocking()
Row(
modifier = Modifier
.height(48.dp)
.fillMaxWidth(),
) {
Row(
modifier = Modifier
.fillMaxHeight()
.clickable {
bottomSheetNavigator.show(SortConfigurationBottomSheetDestination(DynamicPreferenceRepository.TYPE_SORT_FILES))
}
.padding(horizontal = 16.dp),
) {
Text(
viewModel.dynamicPreferenceRepository.getLabelForSortType(abs(sort), LocalContext.current),
modifier = Modifier
.padding(end = 4.dp)
.align(CenterVertically),
color = lowEmphasisColor,
)
Icon(
imageVector = if (sort > 0) SymfoniumIcons.Rounded.ArrowDownward else SymfoniumIcons.Rounded.ArrowUpward,
contentDescription = null,
modifier = Modifier
.size(20.dp)
.align(CenterVertically),
tint = lowEmphasisColor,
)
}
Spacer(modifier = Modifier.weight(1f, fill = true))
Icon(
imageVector = if (searchBarVisible) SymfoniumIcons.Rounded.SearchOff else SymfoniumIcons.Rounded.Search,
contentDescription = null,
modifier = Modifier
.padding(end = 24.dp)
.clip(RoundedCornerShape(8.dp))
.clickable {
state.query = TextFieldValue("")
viewModel.updateTextFilter("")
searchBarVisible = !searchBarVisible
}
.padding(4.dp)
.align(CenterVertically),
tint = lowEmphasisColor,
)
}
}
val files = sources
if (files == null) {
item {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 4.dp),
) {
Row {
CircularProgressIndicator(
modifier = Modifier
.padding(start = 8.dp)
.size(16.dp)
.align(CenterVertically),
strokeWidth = 2.dp,
)
Text(stringResource(id = R.string.loading), modifier = Modifier.padding(16.dp))
}
}
}
} else if (files.isNotEmpty()) {
itemsIndexed(files) { index: Int, mediaItem: MediaItem ->
FileListEntry(mediaItem, onMenuClick = {
bottomSheetNavigator.show(FileActionBottomSheetDestination(mediaItem, false))
}) {
if (mediaItem.isFile) {
viewModel.play(index)
} else {
navigator.navigateTo(FileListDestination(mediaItem))
}
}
}
} else {
item {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 4.dp),
) {
Text(stringResource(id = R.string.files_folder_empty), modifier = Modifier.padding(16.dp))
}
}
}
item {
Spacer(modifier = Modifier.navigationBarsPadding())
}
}
},
)
Maybe to reproduce as in the app it requires the LazyColumnScrollbar
to not be full screen and have a fake box below to simulate the app navbar.
But at least unlike the other linked issue I have a workaround so maybe it's just a really nasty bug in the LazyColumnScrollbar code. (Even if I can't really figure out how it's different from the Grid one except the double scroll call.
to...@gmail.com <to...@gmail.com> #26
Ok so today for an unknown reason my phone became ultra slow with debug compose app and it allowed me to find another completely different way to trigger the same kind of crash. (See stacktrace below)
This is with snapshot 10707888
It requires the app to be really slow to trigger but using this as the wrapper for the LazyGrid
val rendererState by playbackController.rendererState.collectAsState()
val isActiveState by remember { derivedStateOf { rendererState.isActive && rendererState.currentMediaItem.source.mediaType != MediaType.Invalid } }
val peekHeight by remember(paddingValues) {
derivedStateOf { if (isActiveState) COMPACT_PLAYER_HEIGHT else NO_PLAYER_HEIGHT) }
}
BottomSheetScaffold(
scaffoldState = bottomSheetScaffoldState,
sheetElevation = 0.dp,
sheetShape = RectangleShape,
sheetContent = {
//
},
sheetPeekHeight = peekHeight,
) { innerPadding ->
content(innerPadding)
}
then scroll the lazy grid while changing the state to toggle the change of value of the peekHeight and bam crash. Changing the peek height does trigger a change of the innerpadding so a recomposition of the screen with different layout sizes probably triggering a race as very rare if the app is not slowed down.
Process: app.symfonik.music.player.debug, PID: 24826
java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(LayoutNode.kt:1458)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:697)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:681)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.grid.LazyGridMeasuredItem.place(LazyGridMeasuredItem.kt:154)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureKt$measureLazyGrid$6.invoke(LazyGridMeasure.kt:286)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureKt$measureLazyGrid$6.invoke(LazyGridMeasure.kt:285)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureResult.placeChildren(Unknown Source:2)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:379)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:371)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:371)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:515)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:587)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:576)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:569)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
10:39:49.938 AndroidRuntime app.symfonik.music.player.debug E at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:709)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:681)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:231)
at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:185)
at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:166)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:162)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:379)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:371)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:371)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:515)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
10:39:49.942 AndroidRuntime app.symfonik.music.player.debug E at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:709)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinator$1.invoke(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:704)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace(LayoutNodeLayoutDelegate.kt:730)
at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:917)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:492)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:459)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:352)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:937)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:229)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1186)
at android.view.View.draw(View.java:23269)
at android.view.View.updateDisplayListIfDirty(View.java:22133)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
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:7918)
at java.lang.reflect.Method.invoke(Native Method)
10:39:49.942 AndroidRuntime app.symfonik.music.player.debug E at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
10:39:49.973 Crash app.symfonik.music.player.debug E LoggerInitializable.init$lambda$2$lambda$1@216: Unhandled crash in Thread[main,5,main]
java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(LayoutNode.kt:1458)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:697)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:681)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.grid.LazyGridMeasuredItem.place(LazyGridMeasuredItem.kt:154)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureKt$measureLazyGrid$6.invoke(LazyGridMeasure.kt:286)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureKt$measureLazyGrid$6.invoke(LazyGridMeasure.kt:285)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureResult.placeChildren(Unknown Source:2)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:379)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildren$1$1.invoke(LayoutNodeLayoutDelegate.kt:371)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:371)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:515)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:587)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:576)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:569)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
to...@gmail.com <to...@gmail.com> #27
And for even more fun a new case. (Still with 10707888) (Edit: For completeness I've just tried 10736521 that have
In the LazyXXXGrid use on the item (the then
with toggleable
)
Row(
modifier = Modifier
.fillMaxWidth()
.then(if (selectionMode && !isDragging) {
Modifier.toggleable(
value = selected,
interactionSource = remember { MutableInteractionSource() },
indication = null, // do not show a ripple
onValueChange = {
onSelectedClick()
}
)
} else Modifier)
.padding(horizontal = 8.dp, vertical = 4.dp),
) { }
Then scroll the list and toggle selection mode or isDragging during scroll will crash with:
java.lang.IllegalStateException: node attached multiple times
at androidx.compose.ui.Modifier$Node.markAsAttached$ui_release(Modifier.kt:264)
at androidx.compose.ui.node.NodeChain.markAsAttached(NodeChain.kt:290)
at androidx.compose.ui.node.LayoutNode.onReuse(LayoutNode.kt:1344)
at androidx.compose.runtime.changelist.Operation$UseCurrentNode.execute(Operation.kt:319)
at androidx.compose.runtime.changelist.Operations.executeAndFlushAllPendingOperations(Operations.kt:307)
at androidx.compose.runtime.changelist.ChangeList.executeAndFlushAllPendingChanges(ChangeList.kt:77)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:968)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:997)
at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1087)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3554)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3554)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3554)
at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:3554)
at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:630)
at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:620)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcomposeInto(SubcomposeLayout.kt:498)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:471)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:462)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:446)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$Scope.subcompose(SubcomposeLayout.kt:862)
at androidx.compose.foundation.layout.BoxWithConstraintsKt$BoxWithConstraints$1$1.invoke-0kLqBqw(BoxWithConstraints.kt:69)
at androidx.compose.foundation.layout.BoxWithConstraintsKt$BoxWithConstraints$1$1.invoke(BoxWithConstraints.kt:67)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:704)
at androidx.compose.ui.node.InnerNodeCoordinator$LookaheadDelegateImpl.measure-BRTryo0(InnerNodeCoordinator.kt:81)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performLookaheadMeasure$1.invoke(LayoutNodeLayoutDelegate.kt:1572)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performLookaheadMeasure$1.invoke(LayoutNodeLayoutDelegate.kt:1571)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:111)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release$default(OwnerSnapshotObserver.kt:105)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performLookaheadMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1571)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performLookaheadMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:35)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1244)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.measure-BRTryo0(LayoutNodeLayoutDelegate.kt:1185)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1.measure-3p2s80s(Box.kt:114)
10:41:49.202 AndroidRuntime app.symfonik.music.player.debug E at androidx.compose.ui.node.InnerNodeCoordinator$LookaheadDelegateImpl.measure-BRTryo0(InnerNodeCoordinator.kt:81)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performLookaheadMeasure$1.invoke(LayoutNodeLayoutDelegate.kt:1572)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performLookaheadMeasure$1.invoke(LayoutNodeLayoutDelegate.kt:1571)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:111)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release$default(OwnerSnapshotObserver.kt:105)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performLookaheadMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1571)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performLookaheadMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:35)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1244)
at androidx.compose.ui.node.LayoutNode.lookaheadRemeasure-_Sx5XlM$ui_release(LayoutNode.kt:1129)
at androidx.compose.ui.node.LayoutNode.lookaheadRemeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1123)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doLookaheadRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:311)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:475)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:459)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:352)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:937)
at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1442)
at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1416)
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 com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:500)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1912)
at android.app.Activity.dispatchTouchEvent(Activity.java:4299)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:458)
at android.view.View.dispatchPointerEvent(View.java:15309)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6778)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6578)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6034)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6091)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6057)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6222)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6065)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6279)
10:41:49.207 AndroidRuntime app.symfonik.music.player.debug E at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6038)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6091)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6057)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6065)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6038)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9206)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9157)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9126)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9329)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:267)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:247)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:9286)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:9420)
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:824)
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:7918)
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)
to...@gmail.com <to...@gmail.com> #28
And another one with 10736521
I don't have an exact repro for that one but it's the same kind. Would really help to have some more indications in the crashes messages to debug and build repros.
ReorderableItem(reorderableState, key, if (animate) Modifier.animateItemPlacement() else Modifier, orientationLocked, index, content)
In some cases when toggling the animate and there's scroll or item reuse, can't pinpoint the exact repro this will lead to:
java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1519)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:486)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:937)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:230)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1186)
at android.view.View.draw(View.java:23269)
at android.view.View.updateDisplayListIfDirty(View.java:22133)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
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:7918)
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)
When removing the if and always add the animate I can't reproduce the crash.
to...@gmail.com <to...@gmail.com> #29
The last can still be triggered with latest snapshot 10748940. I no more change modifiers.
It's again when something is done during scrolling see attached video.
Would be nice to have some reactions and help about possible causes to build a repro if you need one. LazyList are pretty unstable right now.
java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1519)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:486)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:938)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:230)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1187)
at android.view.View.draw(View.java:23269)
at android.view.View.updateDisplayListIfDirty(View.java:22133)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
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:7918)
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)
The scroll during select is done via (Mostly like
@SuppressLint("ModifierFactoryUnreferencedReceiver")
inline fun <reified Item> Modifier.multiSelectKeyGridDragHandler(
lazyGridState: LazyGridState,
haptics: HapticFeedback,
autoScrollThreshold: Float,
crossinline toggleOneItem: (Item) -> Boolean?,
crossinline selectRangeItems: (selectionMode: Boolean, initialIndex: Item, oldIndex: Item, newIndex: Item) -> Unit,
crossinline setIsDragging: (isDragging: Boolean) -> Unit,
) = composed {
val autoScrollSpeed = remember { mutableFloatStateOf(0f) }
if (autoScrollThreshold > 0) {
LaunchedEffect(autoScrollSpeed.floatValue) {
if (autoScrollSpeed.floatValue != 0f) {
while (isActive) {
lazyGridState.scrollBy(autoScrollSpeed.floatValue)
delay(10)
}
}
}
}
pointerInput(Unit) {
var initialKey: Item? = null
var currentKey: Item? = null
var selectMode = true
detectDragGesturesAfterLongPress(
onDragStart = { offset ->
setIsDragging(true)
(lazyGridState.gridItemKeyAtPosition(offset) as? Item)?.let { key ->
val wasSelected = toggleOneItem(key)
if (wasSelected != null) {
haptics.performHapticFeedback(HapticFeedbackType.LongPress)
initialKey = key
currentKey = key
selectMode = wasSelected
}
}
},
onDragCancel = {
initialKey = null
currentKey = null
autoScrollSpeed.floatValue = 0f
setIsDragging(false)
},
onDragEnd = {
initialKey = null
currentKey = null
autoScrollSpeed.floatValue = 0f
setIsDragging(false)
},
onDrag = { change, _ ->
if (initialKey != null) {
val distFromBottom = lazyGridState.layoutInfo.viewportSize.height - change.position.y
val distFromTop = change.position.y
autoScrollSpeed.floatValue = when {
distFromBottom < autoScrollThreshold -> autoScrollThreshold - distFromBottom
distFromTop < autoScrollThreshold -> -(autoScrollThreshold - distFromTop)
else -> 0f
}
(lazyGridState.gridItemKeyAtPosition(change.position) as? Item)?.let { key ->
if (currentKey != key) {
if (initialKey != null && currentKey != null) {
selectRangeItems(selectMode, initialKey!!, currentKey!!, key)
}
currentKey = key
}
}
}
},
)
}
}
fun LazyGridState.gridItemKeyAtPosition(hitPoint: Offset): Any? =
layoutInfo.visibleItemsInfo.find { itemInfo ->
itemInfo.size.toIntRect().contains(hitPoint.round() - itemInfo.offset)
}?.key
an...@google.com <an...@google.com> #30
I tried to run
For example for the last stacktrace: "replace() called on item that was not placed". It happens inside LookaheadPassDelegate. It has placedOnce set to false, and we call lookaheadReplace() on it. It is unexpected. But also we shouldn't call lookaheadReplace() on a node with "layoutNode.isPlacedInLookahead" set to false. And if a note was placed in lookahead it should have placedOnce set to true.
For "java.lang.IllegalStateException: node attached multiple times" crash I am also not sure how it happens. From LayoutNode.onReuse we have a call to NodeChain.markAsAttached. But right before it we have resetModifierState(), which is iterating through the nodes and detaches them. So it shouldn't be attached.
For "java.lang.IllegalStateException: LayoutNode should be attached to an owner" it is not less surprising. We never expect to have a place call to happen on a node which is not attached. SubcomposeLayout should always attach a node after composing it.
Is there are chance you have some other try/catches in your code which are masking the issue for us? Like the real issue happened somewhere else, we caught it without allowing the app to crash, this resulted in our layout system being stuck in some invalid unexpected state and then we are seeing those crashes, but they are just a side effect.
to...@gmail.com <to...@gmail.com> #31
I do not have any try catch, the added ones in the lazyscroll bar were just a quick random test to see if there's other things happening later (and it did).
For the #29, I had some issues with lazygrid/List wrongly handing touch events, like sometimes (could not figure a pattern) even after the long press started the drag selection, the lazyGrid would scroll instead.
As a fix I added userScrollEnabled = !isDragSelecting,
to the LazyGrid/Lists with isDragSelecting set to true in onDragStart. This not only fixed this annoying issue but also it seems the crashes as I can't reproduce anymore.
All the last crashes reported in this issue that I mostly workaround are tied to scrolling during recomposition with / without modifier replacement.
On the screen that crashed the more easily the items have Modifier.animateItemPlacement()
(See #28) for drag and drop reordering. I tried to remove the modifier when not in reordering mode but it crashed as stated in #28.
For the record a search for "LayoutNode should be attached to an owner" on this tracker shows tons of reported issues (without Google reactions mostly) with tons of +1.
I do have some crashes in prod too (All compose without my code involved in the crashes), but dumb Play Console hides the message and the line numbers since many months and still do not address it. So my next release will have Crashlytics back in prod, sad but may give me back some more details about those crashes.
First crash on attached Play Console issues is a "LayoutNode should be attached to an owner"
The others are missing data from Play Console to know more
Exception java.lang.IllegalStateException:
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release (LayoutNode.kt)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded (MeasureAndLayoutDelegate.kt:465)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout (MeasureAndLayoutDelegate.kt)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout (AndroidComposeView.android.kt)
at androidx.compose.ui.node.Owner.measureAndLayout$default (Owner.kt)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw (AndroidComposeView.android.kt:1183)
at android.view.View.draw (View.java:24409)
at android.view.View.updateDisplayListIfDirty (View.java:23267)
at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4732)
at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4704)
at android.view.View.updateDisplayListIfDirty (View.java:23214)
at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4732)
at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4704)
at android.view.View.updateDisplayListIfDirty (View.java:23214)
at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4732)
at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4704)
at android.view.View.updateDisplayListIfDirty (View.java:23214)
at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4732)
at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4704)
at android.view.View.updateDisplayListIfDirty (View.java:23214)
at android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:777)
at android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:783)
at android.view.ThreadedRenderer.draw (ThreadedRenderer.java:881)
at android.view.ViewRootImpl.draw (ViewRootImpl.java:5647)
at android.view.ViewRootImpl.performDraw (ViewRootImpl.java:5330)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:4486)
at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:3116)
at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:10885)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1301)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1309)
at android.view.Choreographer.doCallbacks (Choreographer.java:923)
at android.view.Choreographer.doFrame (Choreographer.java:852)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1283)
at android.os.Handler.handleCallback (Handler.java:942)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:226)
at android.os.Looper.loop (Looper.java:313)
at android.app.ActivityThread.main (ActivityThread.java:8757)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1067)
an...@google.com <an...@google.com> #32
If two crashes have the same error message it doesn't mean it is the same issue. Most of other "LayoutNode should be attached to an owner" crashes are related to semantics, and yours it not. But this bug might be related -
to...@gmail.com <to...@gmail.com> #33
I know but for us mere mortals without help from Google to move on those issues it's hard / impossible to build repro without guidance.
Even more for me as androidX still does not support Windows to build special release with logs to help me trace stuff.
It takes lot of times and tons of motivation on my side (Indie dev not paid by the hour or at all to work on those :p) but with guidance there's always solutions at some point
For R8 issues (Dozens of P1 issues reported and fixed), I know that issues will be triaged and help given so that time I pass on those won't be wasted.
Anyway sorry for the rant, and it's not against you in particular, just to show the other side of the fence :) Like
TL;DR; as in many previous issues, I'm available to log / debug stuff but can't pass hours trying to build repro without guidance.
an...@google.com <an...@google.com> #34
I understand your disappointment. I was one of them helping you to find a repro sample in the bugs you shared and I appreciate the bugs you create and your dedication on helping us finding a solution.
For bugs like this, where it is unclear what is happening from just reading a code related to the stacktrace it is crucial to be able to reproduce the issue.
I just tried to reproduce it with a code similar to the one mentioned in
Column {
var size by remember { mutableStateOf(100.dp) }
Button(onClick = { size += 10.dp }) {
Text("Increase size")
}
Box(Modifier.animateBounds().size(size).background(Color.Red))
}
and I can't make it crash.
Seems like you can reproduce it locally in your project. The only idea I have is to try to make the code causing the crash simpler and simpler removing the parts of the ui which are not affecting this crash, after doing multiple iterations of that we will have a smaller repro sample. I understand that you might not have time and willingness to do so. Maybe there is a chance you can share the code of your app with me by sending it to my email? I think we did that already in the past with you. We will not be using this code for anything aside from trying to extract a reproducible sample from it
to...@gmail.com <to...@gmail.com> #35
It's more about fatigue after 12 years of bug report than disappointment. The tracker is broken for most part and require to know who to ping. It's just hard to ping without sending mails that are easy to find for the many Googlers I've crossed. But I refuse to directly send mail as it's too invasive. Would love to see improvement but it will not happen :)
About the repro this is the standard way to do it, but with Compose it's harder as there's many things reusable and decoupled with tons of params that impact the whole app, removing just a part is often not easy. Like in my case this is a quite complex application from UI POV. There's a tab navigator in a modalbottomsheet navigator and a dialognavigator added a bottomsheetscaffold to provide the compact player and everything :)
And then in the screen there's many reusable wrappers + all the specific logic. Like in the playlist part (the one crashing the most), there's support for drag to reorder + swipe to dimiss + drag to select (or drag and drop in some cases).
Added the LI export (Iguana C1) + a video of this screen to see some of the features in case it helps.
All that to say that's it's really hard to extract things. And for the moment I've applied all the workaround I've noted in this thread so I have no easy repro anymore without investment.
I currently need to move on with other things, and since I have workaround for most at short term I can only find time for
With that said I can test snapshots and provide logs or do tests if you have ideas to test. In a couple of weeks if nothing have moved I can try again.
As a last word for today, even with all those bugs and issues and everything, it was really nice to build that app with Compose, I finally find fun to do UI and animations, details, drag and drop and all the things I avoided with XML :p Can't wait to see what Doris will provide as the SharedTransition API to add the final missing touch to the app.
to...@gmail.com <to...@gmail.com> #36
See
In my case in the screen that reproduce this the most I do use it for the reorder stuff.
The composable have a param playlistEntries: List<PlaylistEntry>,
Then
@Composable
fun PlaylistEntryList(
lazyListState: LazyGridState,
....
playlistEntries: List<PlaylistEntry>,
....
) {
val playlistEntriesItems = remember { mutableListOf<PlaylistEntry>().toMutableStateList() }
val reorderState = rememberReorderableLazyGridState(
gridState = lazyListState,
onDragEnd = { from, to -> onItemDragged?.invoke(from - 1, to - 1) },
onMove = { from, to -> runCatching { playlistEntriesItems.add(to.index - 1, playlistEntriesItems.removeAt(from.index - 1)) } },
)
val refresher = remember(playlistEntries) {
playlistEntriesItems.clear()
playlistEntriesItems.addAll(playlistEntries)
}
...
itemsIndexed(items = playlistEntriesItems, key = { _, item -> item.id }) { index, item ->
}
}
Since the composable param is a list it's not seen as stable, so i suppose the refresher can run in case of recomposition and if the refresher runs during a scroll we have one of the variations of the crash reported here. (Random supposition here)
I'm maybe using an anti pattern here, with something obviously wrong for you, but it worked well before. Maybe you can find something more with this. And if this is an antipattern have some details about what is wrong so I can check all the parts of the app that use LazyXXX.
to...@gmail.com <to...@gmail.com> #37
So I now reproduce on that screen the initial crash. (replace() called on item that was not placed with lookahead) (This is with latest snapshot too)
I still do not have an external repro but took a couple hours to try to understand what can or can not trigger this and the answer is a combination of AnimatedVisibility
+ deepness of the layout + top wrapper in my case.
The items wrappers:
itemsIndexed(items = playlistEntriesItems, key = { _, item -> item.id }) { index, item ->
ReorderableItem(reorderState, item.id, orientationLocked = true) { isDragging ->
val color by animateColorAsState(if (isDragging) Color.Black.copy(alpha = 0.7f) else Color.Transparent)
Draggable(
modifier = Modifier.background(color),
enabled = false,
dragDataProducer = { item },
) {
if (it == DraggableState.DRAGGABLE) {
DraggedPlaylistEntry(item)
} else {
val onMoreClickHandler = if (onMoreClick == null) {
null
} else {
{ onMoreClick(item, index) }
}
SwipeActions(
endActionsConfig = if (!reorder || selectionMode) {
DefaultSwipeActionsConfig
} else {
SwipeActionsConfig(
threshold = 0.4f,
icon = SymfoniumIcons.Rounded.Delete,
iconTint = MaterialTheme.colorScheme.primary,
background = MaterialTheme.colorScheme.surface,
stayDismissed = true,
onDismiss = { onDelete(item) },
)
},
) {
val selected = selectedPlaylistEntryIds.value.contains(item.id)
PlaylistEntryListEntry(
item,
reorder = reorder && !selectionMode,
selectionMode = selectionMode,
isDragging = isDragSelecting,
selected = selected,
reorderState = reorderState,
additionalData = if (additionalMode != null) {
{ SongAdditionalInfo(mediaItem = item.asMediaItem(), additionalMode = additionalMode, secondAdditionalMode = additionalMode2) }
} else {
null
},
additionalData2 = if (additionalMode2 != null) {
{ SongAdditionalInfo(mediaItem = item.asMediaItem(), additionalMode = additionalMode2, secondAdditionalMode = additionalMode) }
} else {
null
},
onMoreClick = onMoreClickHandler,
onRowClick = { onClick(item, index) },
onSelectedClick = { onSelectedClick(item) },
)
}
}
}
}
}
The items.
@Composable
fun PlaylistEntryListEntry(
playlistEntry: PlaylistEntry,
reorder: Boolean,
selectionMode: Boolean,
selected: Boolean,
isDragging: Boolean,
reorderState: ReorderableLazyGridState,
additionalData: @Composable (() -> Unit)? = null,
additionalData2: @Composable (() -> Unit)? = null,
onMoreClick: (() -> Unit)?,
onRowClick: () -> Unit,
onSelectedClick: () -> Unit,
) {
val imageRequest = getImageRequest(
playlistEntry.asMediaItem(),
exactSize = false,
debugTag = "PlaylistEntryListEntry",
)
val secondLine = playlistEntry.description
val secondLineAdditional = if (additionalData == null && additionalData2 == null) playlistEntry.duration.takeIf { it > 0 }?.secondsToDuration(fillZero = true) else null
val color by animateColorAsState(if (selected) MaterialTheme.colorScheme.primary.copy(alpha = 0.25f) else Color.Unspecified, label = "")
Row(
modifier = Modifier
.fillMaxWidth()
.background(color)
.clickable {
if (!isDragging) {
if (selectionMode) onSelectedClick() else onRowClick()
}
}
.padding(horizontal = 8.dp, vertical = 4.dp),
) {
if (reorder) {
Icon(
imageVector = SymfoniumIcons.Rounded.DragHandle,
null,
modifier = Modifier
.align(CenterVertically)
.padding(start = 4.dp, end = 12.dp)
.detectReorder(reorderState),
)
}
Box(
modifier = Modifier
.size(48.dp)
.clip(RoundedCornerShape(8.dp)),
) {
ImageRequestImage(
imageRequest = imageRequest,
contentDescription = null,
contentScale = ContentScale.Crop,
placeHolderColor = materialPlaceHolderColor(),
errorPainter = rememberImageErrorPainter(SymfoniumIcons.Rounded.QueueMusic, true),
)
}
Spacer(modifier = Modifier.width(8.dp))
Column(
modifier = Modifier
.weight(1f, fill = false)
.align(CenterVertically),
) {
Text(
text = playlistEntry.title,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier.fillMaxWidth(),
)
Row(
modifier = Modifier
.fillMaxWidth()
.padding(top = if (secondLine.isNotEmpty() || secondLineAdditional != null) 2.dp else 0.dp),
) {
if (secondLine.isNotEmpty()) {
Text(
text = secondLine,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.weight(1f, fill = false),
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f),
)
}
if (secondLineAdditional != null) {
Text(
text = if (secondLineAdditional.isEmpty()) "" else " • $secondLineAdditional",
maxLines = 1,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f),
)
}
}
}
if (additionalData != null || additionalData2 != null) {
Column(
modifier = Modifier
.align(CenterVertically)
.padding(vertical = 4.dp),
horizontalAlignment = Alignment.End,
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
if (additionalData != null) {
additionalData()
}
if (additionalData2 != null) {
additionalData2()
}
}
}
if (onMoreClick != null && !selectionMode) {
IconButton(
onClick = onMoreClick,
modifier = Modifier.align(CenterVertically),
) {
Icon(imageVector = SymfoniumIcons.Rounded.MoreVert, contentDescription = "menu")
}
}
if (selectionMode) {
IconButton(
onClick = onSelectedClick,
modifier = Modifier.align(CenterVertically),
) {
Icon(imageVector = SymfoniumIcons.Rounded.RadioButtonUnchecked, contentDescription = "menu", tint = MaterialTheme.colorScheme.primary)
AnimatedVisibility(
visible = selected,
enter = fadeIn(),
exit = fadeOut(),
) {
Icon(imageVector = SymfoniumIcons.Rounded.CheckCircleFilled, contentDescription = "menu", tint = MaterialTheme.colorScheme.primary)
}
}
}
}
}
Since I'm using a variation of
This will randomly trigger the crash.
Removing the AnimatedVisibility
fixes the crashes.
But (and that's the funny part) if in the items wrapper you remove the ReorderableItem
the items no more crashes. To simplify I replaced the ReorderableItem
by a Box
or a Row
and it crashed too.
Removing the Box
or the Row
fixes the crashes too.
(I tried removing the ellipsis or the weight in the item and it does not change anything).
The AnimatedVisibility
is just fade so it should not change layout or cause remeasure. (But same crash with default enter/exit anims)
So sorry no progress on the LayoutNode not attached but I hope this is enough to get the animatedVisibility crash fixed.
java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1519)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:486)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:940)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:230)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1193)
at android.view.View.draw(View.java:23269)
at android.view.View.updateDisplayListIfDirty(View.java:22133)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
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:7918)
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)
to...@gmail.com <to...@gmail.com> #38
And sorry but since there's absolutely no triage in the Compose UI component (Don't know who the
jo...@gmail.com <jo...@gmail.com> #39
to...@gmail.com <to...@gmail.com> #40
Another repro
an...@google.com <an...@google.com> #41
I don't know for sure yes, but we might have multiple separate issues here.
The one reproduced with
In this bug we saw an issue reproduced when AnimatedVisibility is used.
to...@gmail.com <to...@gmail.com> #42
and could be related to a frequent data changes.
At some point I was able to trigger the crash by fast scrolling to a long distance and simply toggling a boolean param on some of the items during the scroll. Boolean used as if (boolean) { Icon() ... }
removing the if on the Icon and changing the icon drawable on the if did fix.
So maybe some node reuse with a different layout. This only happen when the phone to repro is very slow. (So debug mode, CPU limited like overheating or really busy, having a complex screen and layoutinspector opened with auto refresh can probably simulate that well too).
On the bright side I've finished Firebase integration with Crashytics to have proper event logs and data on crashes to hopefully be able to have a lot more insight on the prod crashes and provide more details in the coming couple of weeks.
an...@google.com <an...@google.com> #43
Lets agree that this specific bug is dedicated to the crashes with stacktraces with a error message starting with "java.lang.IllegalStateException: replace() called on item that was not placed".
to...@gmail.com <to...@gmail.com> #44
Another one with "java.lang.IllegalStateException: replace() called on item that was not placed"
Repro there is not enough but you can ask for more and I do have some screens with the same LazyColumn with LazyRows inside.
Will go to prod soon so should have more insight next week.
to...@gmail.com <to...@gmail.com> #45
Continuing the triage here since the other is closed.
I'm also facing this one (The first link have a repro)
Fatal Exception: java.lang.IllegalStateException: Place was called on a node which was placed already
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:1457)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:1311)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.LazyListMeasuredItem.place(LazyListMeasuredItem.kt:182)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:353)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:350)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.LazyListMeasureResult.placeChildren(LazyListMeasureResult.kt)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$2.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$layoutChildren$1.invoke(LayoutNodeLayoutDelegate.kt:1093)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$layoutChildren$1.invoke(LayoutNodeLayoutDelegate.kt:1088)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_release(OwnerSnapshotObserver.kt:81)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_release$default(OwnerSnapshotObserver.kt:75)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.layoutChildren(LayoutNodeLayoutDelegate.kt:1088)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:1470)
at androidx.compose.ui.node.InnerNodeCoordinator$LookaheadDelegateImpl.placeChildren(InnerNodeCoordinator.kt:97)
at androidx.compose.ui.node.LookaheadDelegate.placeAt-f8xVGno(LookaheadDelegate.kt:156)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:589)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LookaheadDelegate.placeChildren(LookaheadDelegate.kt:178)
at androidx.compose.ui.node.LookaheadDelegate.placeAt-f8xVGno(LookaheadDelegate.kt:156)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:577)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:570)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LookaheadDelegate.placeChildren(LookaheadDelegate.kt:178)
at androidx.compose.ui.node.LookaheadDelegate.placeAt-f8xVGno(LookaheadDelegate.kt:156)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LookaheadDelegate.placeChildren(LookaheadDelegate.kt:178)
at androidx.compose.ui.node.LookaheadDelegate.placeAt-f8xVGno(LookaheadDelegate.kt:156)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:231)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$placeAt$1.invoke(LayoutNodeLayoutDelegate.kt:1317)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$placeAt$1.invoke(LayoutNodeLayoutDelegate.kt:1315)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutModifierSnapshotReads$ui_release(OwnerSnapshotObserver.kt:96)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutModifierSnapshotReads$ui_release$default(OwnerSnapshotObserver.kt:90)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:1315)
at androidx.compose.ui.node.LayoutNode.forEachCoordinatorIncludingInner$ui_release(LayoutNode.kt:1250)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:490)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout-0kLqBqw(MeasureAndLayoutDelegate.kt:413)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout-0kLqBqw(AndroidComposeView.android.kt:955)
at androidx.compose.ui.node.LayoutNode.forceRemeasure(LayoutNode.kt:1221)
at androidx.compose.foundation.lazy.LazyListState.onScroll$foundation_release(LazyListState.kt:318)
at androidx.compose.foundation.lazy.LazyListState$scrollableState$1.invoke(LazyListState.kt:179)
at androidx.compose.foundation.lazy.LazyListState$scrollableState$1.invoke(LazyListState.kt:179)
at androidx.compose.foundation.gestures.DefaultScrollableState$scrollScope$1.scrollBy(ScrollableState.kt:166)
at androidx.compose.foundation.gestures.ScrollingLogic$dispatchScroll$performScroll$1.invoke-MK-Hz9U(Scrollable.kt:762)
at androidx.compose.foundation.gestures.ScrollingLogic$dispatchScroll$performScroll$1.invoke(Scrollable.kt:752)
at androidx.compose.foundation.AndroidEdgeEffectOverscrollEffect.applyToScroll-Rhakbz0(AndroidOverscroll.kt:184)
at androidx.compose.foundation.gestures.ScrollingLogic.dispatchScroll-3eAAhYA(Scrollable.kt:778)
at androidx.compose.foundation.gestures.ScrollingLogic$doFlingAnimation$2$outerScopeScroll$1.invoke-MK-Hz9U(Scrollable.kt:833)
at androidx.compose.foundation.gestures.ScrollingLogic$doFlingAnimation$2$outerScopeScroll$1.invoke(Scrollable.kt:832)
at androidx.compose.foundation.gestures.ScrollingLogic$doFlingAnimation$2$scope$1.scrollBy(Scrollable.kt:837)
at androidx.compose.foundation.gestures.DefaultFlingBehavior$performFling$2$1.invoke(Scrollable.kt:967)
at androidx.compose.foundation.gestures.DefaultFlingBehavior$performFling$2$1.invoke(Scrollable.kt:965)
at androidx.compose.animation.core.SuspendAnimationKt.doAnimationFrame(SuspendAnimation.kt:361)
at androidx.compose.animation.core.SuspendAnimationKt.doAnimationFrameWithScale(SuspendAnimation.kt:339)
at androidx.compose.animation.core.SuspendAnimationKt.access$doAnimationFrameWithScale(SuspendAnimation.kt:1)
at androidx.compose.animation.core.SuspendAnimationKt$animate$9.invoke(SuspendAnimation.kt:279)
at androidx.compose.animation.core.SuspendAnimationKt$animate$9.invoke(SuspendAnimation.kt:278)
at androidx.compose.animation.core.SuspendAnimationKt$callWithFrameNanos$2.invoke(SuspendAnimation.kt:304)
at androidx.compose.animation.core.SuspendAnimationKt$callWithFrameNanos$2.invoke(SuspendAnimation.kt:303)
at androidx.compose.runtime.BroadcastFrameClock$FrameAwaiter.resume(BroadcastFrameClock.kt:42)
at androidx.compose.runtime.BroadcastFrameClock.sendFrame(BroadcastFrameClock.kt:71)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:555)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:548)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
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:1299)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
at android.view.Choreographer.doCallbacks(Choreographer.java:923)
at android.view.Choreographer.doFrame(Choreographer.java:847)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8757)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
an...@google.com <an...@google.com> #46
as duplicates of this one as we expect it is caused by the same issue, but the repros from there will still be useful for us to investigate
to...@gmail.com <to...@gmail.com> #47
So got a new different crash stack logged as
For the record
And added a new varation in
to...@gmail.com <to...@gmail.com> #48
So no news and no triage of
Anyway with today's snapshot 10839053 I'm facing
About this specific issue I got a few different variation in Crashlytics like below.
Unfortunately I can't find a pattern in anything from the logs I currently gather in Firebase, so I'm adding more for my next release to try to pin point more details.
Fatal Exception: java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.runtime.collection.MutableVector.forEach(MutableVector.kt:468)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:480)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:486)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:944)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:230)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1197)
at android.view.View.draw(View.java:23269)
at android.view.View.updateDisplayListIfDirty(View.java:22133)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4513)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4486)
at android.view.View.updateDisplayListIfDirty(View.java:22089)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4500)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3687)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2371)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9297)
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:7918)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
an...@google.com <an...@google.com> #49
With a help of a sample project from
LookaheadScope {
LazyColumn {
items(100) {
TextField(
value = "",
onValueChange = {}
)
}
}
}
We need to scroll a bit, then put a focus into one of the items, then scroll to the top so the focused item is not visible anymore. Attached a video of a crash.
Stacktrace is slightly different from the one reported in this bug, but might be caused by the same issue:
java.lang.IllegalStateException: Place was called on a node which was placed already
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.onNodePlaced$ui_debug(LayoutNodeLayoutDelegate.kt:1457)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:1311)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.LazyListMeasuredItem.place(LazyListMeasuredItem.kt:194)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$9.invoke(LazyListMeasure.kt:373)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$9.invoke(LazyListMeasure.kt:370)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.LazyListMeasureResult.placeChildren(Unknown Source:2)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$2.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$layoutChildren$1.invoke(LayoutNodeLayoutDelegate.kt:1093)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$layoutChildren$1.invoke(LayoutNodeLayoutDelegate.kt:1088)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_debug(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_debug(OwnerSnapshotObserver.kt:81)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutSnapshotReads$ui_debug$default(OwnerSnapshotObserver.kt:75)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.layoutChildren(LayoutNodeLayoutDelegate.kt:1088)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.onNodePlaced$ui_debug(LayoutNodeLayoutDelegate.kt:1470)
at androidx.compose.ui.node.InnerNodeCoordinator$LookaheadDelegateImpl.placeChildren(InnerNodeCoordinator.kt:98)
at androidx.compose.ui.node.LookaheadDelegate.placeAt-f8xVGno(LookaheadDelegate.kt:156)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LookaheadDelegate.placeChildren(LookaheadDelegate.kt:178)
at androidx.compose.ui.node.LookaheadDelegate.placeAt-f8xVGno(LookaheadDelegate.kt:156)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:231)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$placeAt$1.invoke(LayoutNodeLayoutDelegate.kt:1317)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate$placeAt$1.invoke(LayoutNodeLayoutDelegate.kt:1315)
15:03:03.514 E at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_debug(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutModifierSnapshotReads$ui_debug(OwnerSnapshotObserver.kt:96)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeLayoutModifierSnapshotReads$ui_debug$default(OwnerSnapshotObserver.kt:90)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:1315)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1552)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_debug(LayoutNode.kt:935)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout-0kLqBqw(MeasureAndLayoutDelegate.kt:413)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout-0kLqBqw(AndroidComposeView.android.kt:969)
at androidx.compose.ui.node.LayoutNode.forceRemeasure(LayoutNode.kt:1230)
at androidx.compose.foundation.lazy.LazyListState.onScroll$foundation_debug(LazyListState.kt:318)
at androidx.compose.foundation.lazy.LazyListState$scrollableState$1.invoke(LazyListState.kt:179)
at androidx.compose.foundation.lazy.LazyListState$scrollableState$1.invoke(LazyListState.kt:179)
at androidx.compose.foundation.gestures.DefaultScrollableState$scrollScope$1.scrollBy(ScrollableState.kt:166)
at androidx.compose.foundation.gestures.ScrollingLogic$dispatchScroll$performScroll$1.invoke-MK-Hz9U(Scrollable.kt:762)
at androidx.compose.foundation.gestures.ScrollingLogic$dispatchScroll$performScroll$1.invoke(Scrollable.kt:752)
at androidx.compose.foundation.AndroidEdgeEffectOverscrollEffect.applyToScroll-Rhakbz0(AndroidOverscroll.kt:184)
at androidx.compose.foundation.gestures.ScrollingLogic.dispatchScroll-3eAAhYA(Scrollable.kt:778)
at androidx.compose.foundation.gestures.ScrollDraggableState.dragBy(Scrollable.kt:886)
at androidx.compose.foundation.gestures.DraggableNode$startListeningForEvents$1$1.invokeSuspend(Draggable.kt:326)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:68)
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)
If we remove LookaheadScope it will not crash. Doris, could you please take a look?
ju...@gmail.com <ju...@gmail.com> #50
I found what appears to be a related crash in our bug logs. This crash happens on a screen using a LazyVerticalStaggeredGrid and only happens occasionally (<5% of users hit it). I haven't been able to reproduce locally yet. If this likely has a different root cause let me know and I can file a new bug with more info.
Compose Version 1.5.1
Stack trace:
java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(SourceFile:1448)
at androidx.compose.ui.node.LayoutNode.invalidateSemantics$ui_release(SourceFile:412)
at androidx.compose.ui.node.SemanticsModifierNodeKt.invalidateSemantics(SourceFile:92)
at androidx.compose.foundation.text.modifiers.TextStringSimpleNode.doInvalidations
at androidx.compose.foundation.text.modifiers.TextStringSimpleElement.update(SourceFile:56)
at androidx.compose.foundation.text.modifiers.TextStringSimpleElement.update(SourceFile:33)
at androidx.compose.ui.node.NodeChainKt.updateUnsafe
at androidx.compose.ui.node.NodeChainKt.access$updateUnsafe
at androidx.compose.ui.node.NodeChain.updateNode(SourceFile:664)
at androidx.compose.ui.node.LayoutNode.recreateUnfoldedChildrenIfDirty(SourceFile:139)
at androidx.compose.ui.node.NodeChain.updateFrom$ui_release
at androidx.compose.ui.node.LayoutNode.setModifier(SourceFile:844)
at androidx.compose.ui.node.ComposeUiNode$Companion$SetModifier$1.invoke
at androidx.compose.ui.node.ComposeUiNode$Companion$SetModifier$1.invoke
at androidx.compose.ui.graphics.vector.VectorComposeKt$Group$2$7.invoke$bridge(SourceFile:0)
at androidx.compose.runtime.ComposerImpl$apply$operation$1.invoke(SourceFile:1712)
at androidx.compose.runtime.ComposerImpl$apply$operation$1.invoke$bridge(SourceFile:0)
at androidx.compose.runtime.ComposerImpl$apply$operation$1.invoke(SourceFile:1710)
at androidx.compose.runtime.ComposerImpl$apply$operation$1.invoke$bridge(SourceFile:0)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(SourceFile:818)
at androidx.compose.runtime.CompositionImpl.applyChanges(SourceFile:849)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(SourceFile:625)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(SourceFile:537)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(SourceFile:41)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(SourceFile:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1229)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
at android.view.Choreographer.doCallbacks(Choreographer.java:899)
at android.view.Choreographer.doFrame(Choreographer.java:827)
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:7918)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
an...@google.com <an...@google.com> #51
This stack trace (with TextStringSimpleNode in it) is tracked in this bug -
to...@gmail.com <to...@gmail.com> #52
For this issue too I'm still completely unable to find a pattern or anything useful for a repro, this is now very rare.
Crashlytics groups a few different ones so I'll paste all of them once again in case there's something interesting in the grouping made by Crashlytics.
Fatal Exception: java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.runtime.collection.MutableVector.forEach(MutableVector.kt:468)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:480)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:486)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.onLayout(AndroidComposeView.android.kt:1074)
at android.view.View.layout(View.java:25087)
at android.view.ViewGroup.layout(ViewGroup.java:6835)
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:25087)
at android.view.ViewGroup.layout(ViewGroup.java:6835)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:25087)
at android.view.ViewGroup.layout(ViewGroup.java:6835)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:25087)
at android.view.ViewGroup.layout(ViewGroup.java:6835)
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:1442)
at android.view.View.layout(View.java:25087)
at android.view.ViewGroup.layout(ViewGroup.java:6835)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4962)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4275)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3151)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11068)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1321)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1329)
at android.view.Choreographer.doCallbacks(Choreographer.java:930)
at android.view.Choreographer.doFrame(Choreographer.java:859)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1303)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8810)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Fatal Exception: java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.runtime.collection.MutableVector.forEach(MutableVector.kt:468)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:480)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:926)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout-0kLqBqw(MeasureAndLayoutDelegate.kt:413)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout-0kLqBqw(AndroidComposeView.android.kt:966)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$precompose$1.premeasure-0kLqBqw(SubcomposeLayout.kt:802)
at androidx.compose.foundation.lazy.layout.LazyLayoutPrefetcher.run(LazyLayoutPrefetcher.android.kt:195)
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:7918)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
Fatal Exception: java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(LayoutNode.kt:1458)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:730)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:714)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.grid.LazyGridMeasuredItem.place(LazyGridMeasuredItem.kt:154)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureKt$measureLazyGrid$6.invoke(LazyGridMeasure.kt:287)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureKt$measureLazyGrid$6.invoke(LazyGridMeasure.kt:286)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.grid.LazyGridMeasureResult.placeChildren(LazyGridMeasureResult.kt)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:364)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:359)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:392)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:548)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:589)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:577)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:570)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:486)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:482)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:740)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:714)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:231)
at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:185)
at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:166)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:162)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:364)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:359)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:392)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:548)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:486)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:482)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:740)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:714)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:231)
at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:185)
at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:166)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:162)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:364)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:359)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:392)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:548)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative(Placeable.kt:452)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative$default(Placeable.kt:204)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:486)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:482)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:740)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace(LayoutNodeLayoutDelegate.kt:759)
at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:917)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:495)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.onLayout(AndroidComposeView.android.kt:1074)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
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:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
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:1431)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4917)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4240)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3116)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
at android.view.Choreographer.doCallbacks(Choreographer.java:923)
at android.view.Choreographer.doFrame(Choreographer.java:852)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8762)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Fatal Exception: java.lang.IllegalStateException: LayoutNode should be attached to an owner
at androidx.compose.ui.node.LayoutNodeKt.requireOwner(LayoutNode.kt:1458)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeOuterCoordinator-f8xVGno(LayoutNodeLayoutDelegate.kt:730)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:714)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM(Placeable.kt:489)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer-aW-9-wM$default(Placeable.kt:320)
at androidx.compose.foundation.lazy.LazyListMeasuredItem.place(LazyListMeasuredItem.kt:182)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:353)
at androidx.compose.foundation.lazy.LazyListMeasureKt$measureLazyList$8.invoke(LazyListMeasure.kt:350)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.foundation.lazy.LazyListMeasureResult.placeChildren(LazyListMeasureResult.kt)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1$measure-3p2s80s$$inlined$createMeasureResult$1.placeChildren(SubcomposeLayout.kt:951)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:364)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:359)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:392)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:548)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place(Placeable.kt:460)
at androidx.compose.ui.layout.Placeable$PlacementScope.place$default(Placeable.kt:218)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:589)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2$1.invoke(AndroidOverscroll.kt:588)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:577)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1$1.invoke(AndroidOverscroll.kt:570)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer(Placeable.kt:486)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeWithLayer$default(Placeable.kt:299)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:486)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:482)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:740)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.placeAt-f8xVGno(LayoutNodeLayoutDelegate.kt:714)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50$default(Placeable.kt:231)
at androidx.compose.foundation.layout.BoxKt.placeInBox(Box.kt:185)
at androidx.compose.foundation.layout.BoxKt.access$placeInBox(Box.kt:1)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:166)
at androidx.compose.foundation.layout.BoxKt$boxMeasurePolicy$1$5.invoke(Box.kt:162)
at androidx.compose.ui.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:364)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$layoutChildrenBlock$1.invoke(LayoutNodeLayoutDelegate.kt:359)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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:392)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.onNodePlaced$ui_release(LayoutNodeLayoutDelegate.kt:548)
at androidx.compose.ui.node.InnerNodeCoordinator.placeAt-f8xVGno(InnerNodeCoordinator.kt:160)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative(Placeable.kt:452)
at androidx.compose.ui.layout.Placeable$PlacementScope.placeRelative$default(Placeable.kt:204)
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.layout.MeasureScope$layout$1.placeChildren(MeasureScope.kt:70)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator.placeAt-f8xVGno(LayoutModifierNodeCoordinator.kt:172)
at androidx.compose.ui.layout.Placeable.access$placeAt-f8xVGno(Placeable.kt:34)
at androidx.compose.ui.layout.Placeable$PlacementScope.place-70tqf50(Placeable.kt:463)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:486)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate$placeOuterCoordinatorBlock$1.invoke(LayoutNodeLayoutDelegate.kt:482)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
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-f8xVGno(LayoutNodeLayoutDelegate.kt:740)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.replace(LayoutNodeLayoutDelegate.kt:759)
at androidx.compose.ui.node.LayoutNode.replace$ui_release(LayoutNode.kt:917)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:495)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.onLayout(AndroidComposeView.android.kt:1074)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
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:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
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:1431)
at android.view.View.layout(View.java:24969)
at android.view.ViewGroup.layout(ViewGroup.java:6784)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4917)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4240)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3116)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
at android.view.Choreographer.doCallbacks(Choreographer.java:923)
at android.view.Choreographer.doFrame(Choreographer.java:852)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8762)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Fatal Exception: java.lang.IllegalStateException: visitLocalDescendants called on an unattached node
at androidx.compose.ui.node.NodeCoordinator.shouldSharePointerInputWithSiblings(NodeCoordinator.kt:1675)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:222)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:578)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:582)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:580)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:580)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:529)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:578)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:582)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:580)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:580)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:582)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:580)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:580)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:529)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:578)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:582)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:580)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:580)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:582)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:580)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:580)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:529)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:578)
at androidx.compose.ui.node.NodeCoordinator.access$hit-1hIXUjU(NodeCoordinator.kt:54)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:582)
at androidx.compose.ui.node.NodeCoordinator$hit$1.invoke(NodeCoordinator.kt:580)
at androidx.compose.ui.node.HitTestResult.hitInMinimumTouchTarget(HitTestResult.kt:117)
at androidx.compose.ui.node.HitTestResult.hit(HitTestResult.kt:97)
at androidx.compose.ui.node.NodeCoordinator.hit-1hIXUjU(NodeCoordinator.kt:580)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:529)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.NodeCoordinator.hitTestChild-YqVAtuI(NodeCoordinator.kt:678)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.NodeCoordinator$Companion$PointerInputSource$1.childHitTest-YqVAtuI(NodeCoordinator.java:1225)
at androidx.compose.ui.node.InnerNodeCoordinator.hitTestChild-YqVAtuI(InnerNodeCoordinator.kt:210)
at androidx.compose.ui.node.NodeCoordinator.hitTest-YqVAtuI(NodeCoordinator.kt:526)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release(LayoutNode.kt:951)
at androidx.compose.ui.node.LayoutNode.hitTest-M_7yMNQ$ui_release$default(LayoutNode.kt:944)
at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:99)
at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1549)
at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1500)
at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1439)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3812)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3435)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3812)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3435)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3812)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3435)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3812)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3435)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:767)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1881)
at android.app.Activity.dispatchTouchEvent(Activity.java:3501)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:719)
at android.view.View.dispatchPointerEvent(View.java:13734)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6244)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6022)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5471)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5524)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5490)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5649)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5498)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5706)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5471)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5524)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5490)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5498)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5471)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8628)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8477)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8430)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8743)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:198)
at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
at android.os.MessageQueue.next(MessageQueue.java:326)
at android.os.Looper.loop(Looper.java:183)
at android.app.ActivityThread.main(ActivityThread.java:7266)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
ti...@google.com <ti...@google.com> #53
Thanks for the repro Andrey. The snippet in
Upon investigation, I found the root cause for crash java.lang.IllegalStateException: replace() called on item that was not placed
. A bug in the lookahead pass in LazyList is causing Placeable
s to be duplicated when one or more items are pinned. I'll upload the fix for it soon.
The other crashes are unlikely related to it.
ti...@google.com <ti...@google.com>
co...@protonmail.com <co...@protonmail.com> #54
FWIW, I only encountered this in prod after recently updating all of my compose dependencies and bumping up to sdk 34. Please let me know what release the fix goes in so i can ship to my users. Thank you!
ap...@google.com <ap...@google.com> #55
Branch: androidx-main
commit 93632b3db207e1a1f91eceece98011eae6313ac9
Author: Doris Liu <tianliu@google.com>
Date: Fri Oct 06 10:58:56 2023
Avoid duplicated items in lazy list during lookahead
Also updated the target position for item placement
animation to account for item spacing when lookahead
is not present. This change makes the target calculation
more consistent (though not the same) across the two
passes.
Test: Added lookahead variants for pinnable container
tests.
Bug: 295745063
Change-Id: I7fa6b84854ecb922bb80a32867243729261b9c8f
M compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/LazyListItemPlacementAnimationTest.kt
M compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinnableContainerTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemAnimator.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
mr...@gmail.com <mr...@gmail.com> #56
to...@gmail.com <to...@gmail.com> #57
Don't be too impatient :)
Doris / Andrey I've updated to Snapshot 10934060 to test things and there's now new crashes when removing items.
Very simple code:
var sources by mutableStateOf<List<MediaItem>>(emptyList())
launch {
sources = mediaProvider?.getFileSources(MediaType.Music, application) ?: emptyList()
}
items(sources) {
}
Remove an item from the list and crash: (Don't know if it's related to those changes or not) No crash with 1.6 alpha 7
java.lang.IndexOutOfBoundsException: Index 6, size 6
at androidx.compose.foundation.lazy.layout.MutableIntervalList.checkIndexBounds(IntervalList.kt:183)
at androidx.compose.foundation.lazy.layout.MutableIntervalList.get(IntervalList.kt:166)
at androidx.compose.foundation.lazy.layout.LazyLayoutIntervalContent.getKey(LazyLayoutIntervalContent.kt:86)
at androidx.compose.foundation.lazy.LazyListItemProviderImpl.getKey(LazyListItemProvider.kt:85)
at androidx.compose.foundation.lazy.LazyListMeasuredItemProvider.getAndMeasure(LazyListMeasuredItemProvider.kt:46)
at androidx.compose.foundation.lazy.LazyListMeasureKt.createItemsAfterList(LazyListMeasure.kt:418)
at androidx.compose.foundation.lazy.LazyListMeasureKt.measureLazyList-50ZNEM8(LazyListMeasure.kt:278)
at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.invoke-0kLqBqw(LazyList.kt:328)
at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.invoke(LazyList.kt:193)
at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke-0kLqBqw(LazyLayout.kt:107)
at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke(LazyLayout.kt:100)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:708)
at androidx.compose.ui.node.InnerNodeCoordinator$LookaheadDelegateImpl.measure-BRTryo0(InnerNodeCoordinator.kt:81)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2.invoke-3p2s80s(AndroidOverscroll.kt:584)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$2.invoke(AndroidOverscroll.kt:583)
at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:291)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator$LookaheadDelegateForLayoutModifierNode.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:64)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1.invoke-3p2s80s(AndroidOverscroll.kt:568)
at androidx.compose.foundation.AndroidOverscrollKt$StretchOverscrollNonClippingLayer$1.invoke(AndroidOverscroll.kt:567)
at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:291)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator$LookaheadDelegateForLayoutModifierNode.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:64)
at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:646)
at androidx.compose.ui.node.LayoutModifierNodeCoordinator$LookaheadDelegateForLayoutModifierNode.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:64)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performLookaheadMeasure$1.invoke(LayoutNodeLayoutDelegate.kt:1622)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performLookaheadMeasure$1.invoke(LayoutNodeLayoutDelegate.kt:1621)
at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2303)
at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:496)
at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:111)
at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release$default(OwnerSnapshotObserver.kt:105)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performLookaheadMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1621)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performLookaheadMeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:36)
17:09:26.685 AndroidRuntime app.symfonik.music.player.debug E at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:1289)
at androidx.compose.ui.node.LayoutNode.lookaheadRemeasure-_Sx5XlM$ui_release(LayoutNode.kt:1126)
at androidx.compose.ui.node.LayoutNode.lookaheadRemeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1120)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doLookaheadRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:313)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:478)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:461)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:969)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:230)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1222)
at android.view.View.draw(View.java:23892)
at android.view.View.updateDisplayListIfDirty(View.java:22756)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513)
at android.view.View.updateDisplayListIfDirty(View.java:22712)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513)
at android.view.View.updateDisplayListIfDirty(View.java:22712)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513)
at android.view.View.updateDisplayListIfDirty(View.java:22712)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4540)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4513)
at android.view.View.updateDisplayListIfDirty(View.java:22712)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:694)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:700)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:798)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4939)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4643)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3822)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2465)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9305)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1339)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1348)
at android.view.Choreographer.doCallbacks(Choreographer.java:952)
at android.view.Choreographer.doFrame(Choreographer.java:882)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1322)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
an...@google.com <an...@google.com> #58
to...@gmail.com <to...@gmail.com> #59
No it's done on mainthread.
LaunchedEffect(xxx) {
viewModel.loadSources()
}
suspend fun loadSources() {
sources= some suspendcall that may or not change thread
}
this is current code, the update happens on mainthread AFAIK.
an...@google.com <an...@google.com> #60
to...@gmail.com <to...@gmail.com> #61
I have not yet debugged that one just found out
This happen on a simple Screen so I may be able to allocate time to repro next week.
Never happened before on that screen without any changes of code related except updating from a7 to snapshot.
to...@gmail.com <to...@gmail.com> #62
And forget to tell but it's 100% repro, remove lead to crash each time. Adding item works. Removing the just added crash.
to...@gmail.com <to...@gmail.com> #63
Do you have the snaphot number for
And do you think there a way to have the builds link
ti...@google.com <ti...@google.com> #64
Re
Thanks for reporting the issue. I was able to reproduce it. This is indeed introduced by the recently merged CL. Will upload a fix.
to...@gmail.com <to...@gmail.com> #65
Thanks. For the record the emails are hidden by default to other users so you should probably not paste them like that for privacy.
ti...@google.com <ti...@google.com> #66
Re
Thanks for pointing that out. Updated posts.
ti...@google.com <ti...@google.com> #67
Re
to...@gmail.com <to...@gmail.com> #68
Yes I know but as Windows user that can't build Androidx, bisect are just impossible without that would be nice if there was a way to escalate the request.
ti...@google.com <ti...@google.com> #69
Please file a feature request.
For the time-being, you could ask in the bug for the specific snapshot #. Here's where you can find the artifacts for the change in
to...@gmail.com <to...@gmail.com> #70
Opened
Being autonomous to find the regression allows to name the proper person and increase triage success rate by 99%.
For example
Or
Even when I can have someone manually triage the issue like
Reporting issue is all but pain for mortals like us, so anything that can help us is a big win for the few of us who keep motivation to help after all that time.
Sorry for the new rant, but if
ti...@google.com <ti...@google.com> #71
Re
I replied/rerouted most of the bugs linked in #70. Thanks for bringing them to my attention. Please be patient as we plow through a considerable amount of bugs. As much as we'd like, not all can be prioritized.
ap...@google.com <ap...@google.com> #72
Branch: androidx-main
commit 7ea8297e638b31587bc9caeecea93280a3d4ce56
Author: Doris Liu <tianliu@google.com>
Date: Fri Oct 13 10:53:26 2023
Check item count before retaining items from last post-lookahead
Bug: 295745063
Test: Lookahead variant is added to existing tests that covered the
intended behavior
Change-Id: If4a5f3989b564cda98b7d2a011dde5f636798f26
M compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/lazy/list/LazyColumnTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
to...@gmail.com <to...@gmail.com> #73
About #71 just to be clear but I have no problem with resolution durations or closing issues with won't implement or any other actual things that can happen with issues.
My issue is that there's 0, none, nada triage at all and most of the issues are just ignored unless I ping someone to triage. Something I try to do when they are really important issues, but no more bother to do on all issues as this is invasive to the people I ping and the only way I can ping. For the
All I ask is that issues are triaged and we get a, it's an issue, it's not an issue, we need more details, ... From an actual person that understand the issue and not a random guy asking for a full repro and videos and us loosing tons of hours (unpaid) and the issue still being ignored after. (That's for some other tracker categories)
R8 Team have a lot less reports of course, but they really manage this perfectly and it's a pleasure to report issues there. And I always take the necessary time to report because I know it's not for nothing.
Anyway end of the rant :) Will test Monday with you last commit and report back.
to...@gmail.com <to...@gmail.com> #74
So yes no more crash on item removal with that last commit.
Will start my new beta with a snapshot that contains this and all the other fixes and report back if I still see some of the errors that should be fixed.
I've duplicated the gerrit / CI issue at
to...@gmail.com <to...@gmail.com> #75
So with snapshot 10950357 still got some crashlytics reports.
Fatal Exception: java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.runtime.collection.MutableVector.forEach(MutableVector.kt:467)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:525)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:923)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout-0kLqBqw(MeasureAndLayoutDelegate.kt:415)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout-0kLqBqw(AndroidComposeView.android.kt:984)
at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$precompose$1.premeasure-0kLqBqw(SubcomposeLayout.kt:806)
at androidx.compose.foundation.lazy.layout.LazyLayoutPrefetcher.run(LazyLayoutPrefetcher.android.kt:195)
at android.os.Handler.handleCallback(Handler.java:938)
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:7883)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009)
I do not have any navigation logs attached it crashes nearly just after a session start and if there's no navigation events it suggest that it's after a state restore from app background kill.
to...@gmail.com <to...@gmail.com> #76
Since a bug in the navigation library was fixed I've added back global transitions in a recent beta build that wrap the content in:
This resulted in a huge increase of the crash
This also resulted for some users in weird display bugs where compose displays things at wrong places.
See
For some users it's after getting back from home maybe after app kill in background as one suspect proposed earlier.
For another one seems he could reproduce by just rotating the screen. (That should not trigger the transition so that's strange)
Removing that transition seemed to fix the issue.
Please note that I do use that FadeTransition for the inner navigation inside the tabs, so it can still be one of the cause even if I still can't reproduce at all :(.
ti...@google.com <ti...@google.com> #77
Is this crash still reproducible:
java.lang.IllegalStateException: LayoutNode should be attached to an owner
?
If not, the remaining issue for this bug is the crash in
We recently made a change that fixed a screen rotation issue that is probably related to what you referred to in
to...@gmail.com <to...@gmail.com> #78
According to crashlytics I still have some Fatal Exception: java.lang.IllegalStateException: LayoutNode should be attached to an owner
and Fatal Exception: java.lang.IllegalStateException: LayoutCoordinate operations are only valid when isAttached is true
with snapshot 10960771
Unfortunately the fix for vectordrawable triggering all the recompose have been reverted and still not back in main, so I can't really test new snapshots in prod without that huge performance loss for all users that is not really acceptable :(
When
ti...@google.com <ti...@google.com> #79
Correction: java.lang.IllegalStateException: replace() called on item that was not placed
gl...@gmail.com <gl...@gmail.com> #80
I got the same bug with 1.6.0-beta01 androidx compose libraries versions and 1.2.0-alpha11 MDC3 version:
Fatal Exception: java.lang.IllegalStateException: replace() called on item that was not placed
at androidx.compose.runtime.collection.MutableVector.forEach(MutableVector.java:466)
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.java:525)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:923)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:488)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:463)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:972)
at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1493)
at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1467)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3863)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3551)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:733)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1922)
at android.app.Activity.dispatchTouchEvent(Activity.java:4051)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:70)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:691)
at android.view.View.dispatchPointerEvent(View.java:14644)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6526)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6313)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5751)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5804)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5770)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5926)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5778)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5983)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5751)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5804)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5770)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5778)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5751)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8910)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8771)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8724)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9046)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:194)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:183)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:8986)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:9073)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:996)
at android.view.Choreographer.doCallbacks(Choreographer.java:794)
at android.view.Choreographer.doFrame(Choreographer.java:722)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:981)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7948)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
ti...@google.com <ti...@google.com> #81
Re
Do you happen to have a way to reproduce this crash?
pl...@gmail.com <pl...@gmail.com> #82
[Deleted User] <[Deleted User]> #83
1.6.0-beta01 still crash.
[Deleted User] <[Deleted User]> #84
at androidx.compose.ui.node.LayoutNodeLayoutDelegate$LookaheadPassDelegate.replace(LayoutNodeLayoutDelegate.kt:1568)
at androidx.compose.ui.node.LayoutNode.lookaheadReplace$ui_release(LayoutNode.kt:923)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:488)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:463)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:354)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:972)
at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:230)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1225)
co...@protonmail.com <co...@protonmail.com> #85
Is there a CL for this that someone from google can link to?
da...@axabee.com <da...@axabee.com> #86
gl...@gmail.com <gl...@gmail.com> #87
With the new 1.6.0-beta02 compose version and 1.2.0-alpha12 MDC3 version, this crash occurs more frequently!
ma...@gmail.com <ma...@gmail.com> #88
gl...@gmail.com <gl...@gmail.com> #89
After removing "animateItemPlacement" from the code below in a "LazyColumn", I no longer get this crash on my crashlytics dashboard (Compose version 1.6.0-beta03):
LazyColumn(
...
SwipeToDismissBox(
modifier = Modifier.animateItemPlacement(
animationSpec = spring(
dampingRatio = Spring.DampingRatioMediumBouncy,
stiffness = Spring.StiffnessLow
)
),
...
}
ti...@google.com <ti...@google.com> #90
FYI, the crash java.lang.IllegalStateException: replace() called on item that was not placed
has been fixed with:
Based on the comments above, java.lang.IllegalStateException: LayoutNode should be attached to an owner
has multiple root causes. Has there been any recent report of it, or has it been fixed?
ti...@google.com <ti...@google.com> #91
No reports for 3+ months since
Closing as fixed.
mo...@hotstar.com <mo...@hotstar.com> #92
This is still happening in Compose Update 1.6.7 (BOM: 2024.05.00) :(
an...@google.com <an...@google.com> #93
If you can reproduced it on the latest beta of Compose 1.7 please file a separate bug. thanks
ut...@gmail.com <ut...@gmail.com> #94
I am also facing this issue on the latest compose version 1.6.8.
I see a crash with IOB exception when trying to delete an item from the LazyRow.
Filed a new ticket:
kr...@lisek.app <kr...@lisek.app> #95
greetings
mr...@gmail.com <mr...@gmail.com> #96
Still happening on 1.7.6 in 2025 :(
ti...@google.com <ti...@google.com> #97
Re
ma...@gmail.com <ma...@gmail.com> #98
NOT fixed:
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:3328)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2998)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3328)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2998)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3328)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2998)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3328)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2998)
at com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:776)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1967)
at android.app.Activity.dispatchTouchEvent (Activity.java:4548)
at com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:734)
at android.view.View.dispatchPointerEvent (View.java:16489)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:8602)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:8353)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:7682)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:7739)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:7705)
at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:7908)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:7713)
at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:7965)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:7686)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:7739)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:7705)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:7713)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:7686)
at android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:11250)
at android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:11119)
at android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:11075)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:11384)
at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:337)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents
at android.view.InputEventReceiver.consumeBatchedInputEvents (InputEventReceiver.java:281)
at android.view.ViewRootImpl.doConsumeBatchedInput (ViewRootImpl.java:11333)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run (ViewRootImpl.java:11479)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1689)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1698)
at android.view.Choreographer.doCallbacks (Choreographer.java:1153)
at android.view.Choreographer.doFrame (Choreographer.java:1064)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1646)
at android.os.Handler.handleCallback (Handler.java:958)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:230)
at android.os.Looper.loop (Looper.java:319)
at android.app.ActivityThread.main (ActivityThread.java:8919)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:578)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1103)
ti...@google.com <ti...@google.com> #99
Re
The stack trace that you saw is different than what this bug was filed for: java.lang.IllegalStateException: replace() called on item that was not placed
and java.lang.IllegalStateException: LayoutNode should be attached to an owner
.
Somehow this issue has accumulated a bunch of varied crashes over time. But that's not helpful for everyone to follow which bugs have been fixed, and which ones haven't.
With that said, could you file a separate bug with the stacktrace in
ah...@dubizzlelabs.com <ah...@dubizzlelabs.com> #100
However, that issue is forwarded here as a duplicate.
ti...@google.com <ti...@google.com> #101
It was incorrect to duplicate
Note: the stacktrace in
Description
Jetpack Compose version: 1.6 A3 Jetpack Compose component used: Many Android Studio Build: H C15 Kotlin version: 1.9.0
Currently out of home but since pushing a beta release with compose updated to 1.6 alpha3 (From alpha2 in prod) I'm getting a lot of crash report: