coil-kt / coil

Image loading for Android and Compose Multiplatform.

Home Page:https://coil-kt.github.io/coil/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SubcomposeAsyncImage: IllegalArgumentException after updating to Compose 1.2.0-alpha08

leinardi opened this issue · comments

Describe the bug
After updating Compose from version 1.2.0-alpha07 to 1.2.0-alpha08 and, consequently, Koltin from version 1.6.10 to 1.6.20, I get a crash while using SubcomposeAsyncImage inside a LazyColumn.
The issue does not happens using Compose 1.2.0-alpha07.

To Reproduce
Repro project: https://github.com/leinardi/Forlago/tree/task/coilAsyncImage
Just check out the branch coilAsyncImage, run the MainActivity and scroll the list.

The relevant code:

        SubcomposeAsyncImage(
            model = ImageRequest.Builder(LocalContext.current)
                .data(url)
                .crossfade(crossfade)
                .build(),
            contentDescription = contentDescription,
            modifier = Modifier
                    .layoutId(LayoutId.IMAGE)
                    .size(56.dp)
                    .clip(CircleShape),
        )

Logs/Screenshots
Coil logging is enabled but, from what I can see, there are no useful information:

 I  💾 Successful (DISK) - https://<redacted>.jpg
 I  💾 Successful (DISK) - https://<redacted>.jpg
 D  Shutting down VM
 E  FATAL EXCEPTION: main
  Process: com.company.link.debug, PID: 28816
  java.lang.IllegalArgumentException: Inconsistency between the count of nodes tracked by the state (0) and the children count on the SubcomposeLayout (1). Are you trying to use the state of the disposed SubcomposeLayout?
  	at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.makeSureStateIsConsistent(SubcomposeLayout.kt:514)
  	at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(SubcomposeLayout.kt:391)
  	at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$Scope.subcompose(SubcomposeLayout.kt:715)
  	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:581)
  	at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:44)
  	at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:405)
  	at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:53)
  	at androidx.compose.foundation.layout.SizeModifier.measure-3p2s80s(Size.kt:781)
  	at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:53)
  	at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1388)
  	at androidx.compose.ui.node.LayoutNode$performMeasure$1.invoke(LayoutNode.kt:1387)
  	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2063)
  	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:112)
  	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:78)
  	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:66)
  	at androidx.compose.ui.node.LayoutNode.performMeasure-BRTryo0$ui_release(LayoutNode.kt:1387)
  	at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:94)
  	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.kt:1341)
  	at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1337)
  	at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:187)
  	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:274)
  	at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:38)
  	at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:208)
  	at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:740)
  	at androidx.compose.ui.node.Owner$DefaultImpls.measureAndLayout$default(Owner.kt:196)
  	at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:937)
  	at android.view.View.draw(View.java:22353)
  	at android.view.View.updateDisplayListIfDirty(View.java:21226)
  	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
  	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
  	at android.view.View.updateDisplayListIfDirty(View.java:21186)
  	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
  	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
  	at android.view.View.updateDisplayListIfDirty(View.java:21186)
  	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
  	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
  	at android.view.View.updateDisplayListIfDirty(View.java:21186)
  	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
  	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
 E  	at android.view.View.updateDisplayListIfDirty(View.java:21186)
  	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
  	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
  	at android.view.View.updateDisplayListIfDirty(View.java:21186)
  	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
  	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
  	at android.view.View.updateDisplayListIfDirty(View.java:21186)
  	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559)
  	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:565)
  	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:642)
  	at android.view.ViewRootImpl.draw(ViewRootImpl.java:4101)
  	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3828)
  	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3099)
  	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
  	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
  	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
  	at android.view.Choreographer.doCallbacks(Choreographer.java:796)
  	at android.view.Choreographer.doFrame(Choreographer.java:731)
  	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)

Version
Coil version 2.0.0-rc03
Can be reproduced on an Android Emulator Nexus 5 API 30 with a Play Store system image
image

It seems to be related to this compose issue: https://issuetracker.google.com/issues/229752147

EDIT
Added repro project to the OP.

Looks like the fix is present in Compose 1.2.0-beta01.