Jéluchu
Jéluchu

Reputation: 484

DropdownMenu gives error when trying to open it in a LazyVerticalGrid

I have updated the Jetpack Compose libraries to version 1.1.0-rc01 and composeOptions.kotlinCompilerExtensionVersion = "1.1.0-rc02" and the DropdownMenu component has stopped working in the lists with Grids, below I show how I had configured this component:

        MaterialTheme(shapes = MaterialTheme.shapes.copy(medium = RoundedCornerShape_16)) {

            vm.isResident(villager.fileName)
            vm.isVillager(villager.fileName)

            DropdownMenu(
                expanded = expanded.value,
                onDismissRequest = { expanded.value = false }
            ) {

                DropdownVillagers(
                    vm = vm,
                    villager = villager,
                    onItemClicked = { onItemClicked() },
                    isResidentChanged = isResidentChanged,
                    isFavouriteChanged = isFavouriteChanged,
                    onDismiss = { expanded.value = false }
                )

            }

        }

DropdownVillagers is a composable containing a DropdownMenuItem and a DropdownItemOption inside. And the error returned by the logcat after trying to display the DropdownMenu is the following:

java.lang.IllegalStateException: Check failed.
        at androidx.compose.foundation.lazy.LazyGridKt$ItemRow$2.measure-3p2s80s(LazyGrid.kt:451)
        at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:55)
        at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke(OuterMeasurablePlaceable.kt:99)
        at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke(OuterMeasurablePlaceable.kt:98)
        at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1798)
        at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:88)
        at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:76)
        at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:98)
        at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.kt:1317)
        at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1313)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure(MeasureAndLayoutDelegate.kt:170)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:228)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:38)
        at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:201)
        at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:662)
        at androidx.compose.ui.node.Owner$DefaultImpls.measureAndLayout$default(Owner.kt:182)
        at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:846)
        at android.view.View.draw(View.java:22647)
        at android.view.View.updateDisplayListIfDirty(View.java:21519)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4512)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4485)
        at android.view.View.updateDisplayListIfDirty(View.java:21475)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4512)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4485)
        at android.view.View.updateDisplayListIfDirty(View.java:21475)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4512)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4485)
        at android.view.View.updateDisplayListIfDirty(View.java:21475)
        at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4512)
        at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4485)
        at android.view.View.updateDisplayListIfDirty(View.java:21475)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:534)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:540)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:616)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:4421)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4149)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3309)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2126)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8653)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
        at android.view.Choreographer.doCallbacks(Choreographer.java:845)
        at android.view.Choreographer.doFrame(Choreographer.java:780)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
        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:7839)

Upvotes: 1

Views: 790

Answers (1)

Sven Jacobs
Sven Jacobs

Reputation: 6995

Some important parts are missing from your code snippet, for instance the LazyVerticalGrid you're talking about, so I can only guess.

If we look at the source of the exception (LazyGrid.kt:451) we find the following line:

check(measurables.size == rowContent.size)

It seems you are adding more than one composable as the item content in your items() function, don't do that.

Let's assume we have a LazyVerticalGrid with a fixed size of three cells.

LazyVerticalGrid(
  cells = GridCells.Fixed(3)
) {

  items(myItems) { item ->
    MyItem(item)
  }
}

Now you want to add a header that spans three cells, so it takes the full width of the grid.

LazyVerticalGrid(
  cells = GridCells.Fixed(3)
) {

  item(
    span = { GridItemSpan(3) }
  ) {
    MyHeader()
    Divider() // This will cause the error
  }

  items(myItems) { item ->
    MyItem(item)
  }
}

Instead always wrap multiple composables in a container.

LazyVerticalGrid(
  cells = GridCells.Fixed(3)
) {

  item(
    span = { GridItemSpan(3) }
  ) {
    Column { // Fix
      MyHeader()
      Divider()
    }
  }

  items(myItems) { item ->
    MyItem(item)
  }
}

This answer relates to Jetpack Compose version 1.1.0-rc01.

Upvotes: 1

Related Questions