Anyone else having issues with `ListDetailPaneScaf...
# compose-android
a
Anyone else having issues with
ListDetailPaneScaffold
and
SecondaryTabRow
on the latest Material3/Material3Adaptive libraries? I’m getting a crash when navigating from the
listPane
to the
detailPane
.
The following example crashes with:
Copy code
FATAL EXCEPTION: main (Ask Gemini)
Process: com.example.adaptivecrash, PID: 29590
java.lang.IllegalArgumentException: maxWidth must be >= than minWidth,
maxHeight must be >= than minHeight,
minWidth and minHeight must be >= 0
	at androidx.compose.ui.unit.InlineClassHelperKt.throwIllegalArgumentException(InlineClassHelper.kt:30)
	at androidx.compose.ui.unit.Constraints.copy-Zbe2FdA(Constraints.kt:671)
	at androidx.compose.ui.unit.Constraints.copy-Zbe2FdA$default(Constraints.kt:179)
	at androidx.compose.material3.TabIndicatorOffsetNode.measure-3p2s80s(TabRow.kt:761)
	at androidx.compose.ui.node.LayoutModifierNodeCoordinator$LookaheadDelegateForLayoutModifierNode.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:93)
	at androidx.compose.ui.node.LookaheadPassDelegate$performMeasure$1.invoke(LookaheadPassDelegate.kt:438)
	at androidx.compose.ui.node.LookaheadPassDelegate$performMeasure$1.invoke(LookaheadPassDelegate.kt:437)
	at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:2496)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:460)
	at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:244)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:124)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:105)
	at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release$default(OwnerSnapshotObserver.kt:99)
	at androidx.compose.ui.node.LookaheadPassDelegate.performMeasure-BRTryo0$ui_release(LookaheadPassDelegate.kt:437)
	at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performLookaheadMeasure-BRTryo0$ui_release(LayoutNodeLayoutDelegate.kt:335)
	at androidx.compose.ui.node.LookaheadPassDelegate.remeasure-BRTryo0(LookaheadPassDelegate.kt:478)
	at androidx.compose.ui.node.LayoutNode.lookaheadRemeasure-_Sx5XlM$ui_release(LayoutNode.kt:1198)
	at androidx.compose.ui.node.LayoutNode.lookaheadRemeasure-_Sx5XlM$ui_release$default(LayoutNode.kt:1192)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.doLookaheadRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:348)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:557)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:535)
	at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:390)
	at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:1548)
	at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.kt:252)
	at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1896)
	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) (Ask Gemini)
	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)
Copy code
var tabIndex by remember { mutableIntStateOf(0) }
            var selectedItem by remember { mutableStateOf<Int?>(null) }
            val scaffoldNavigator = rememberListDetailPaneScaffoldNavigator()
            val scope = rememberCoroutineScope()
            BackHandler(enabled = scaffoldNavigator.canNavigateBack()) {
                scope.launch {
                    scaffoldNavigator.navigateBack()
                }
            }
            LaunchedEffect(selectedItem) {
                when {
                    selectedItem == null && scaffoldNavigator.canNavigateBack() -> {
                        scaffoldNavigator.navigateBack()
                    }

                    selectedItem != null -> {
                        scaffoldNavigator.navigateTo(pane = ListDetailPaneScaffoldRole.Detail)
                    }
                }
            }

ListDetailPaneScaffold(
    modifier = Modifier.safeDrawingPadding(),
    directive = scaffoldNavigator.scaffoldDirective,
    value = scaffoldNavigator.scaffoldValue,
    listPane = {
        Column {
            SecondaryTabRow(
                selectedTabIndex = tabIndex
            ) {
                (1..3).forEachIndexed { index, value ->
                    Tab(
                        selected = index == tabIndex,
                        onClick = {
                            tabIndex = index
                        },
                    ) {
                        Text("Tab $value")
                    }
                }
            }
            repeat(5) {
                ListItem(
                    modifier = Modifier.clickable {
                        selectedItem = it
                    },
                    headlineContent = {
                        Text(
                            text = "Items $it"
                        )
                    }
                )
            }
        }
    },
    detailPane = {
        Column {
            Text("Selected: $selectedItem")
            Button(
                onClick = {
                    selectedItem = null
                }
            ) {
                Text("Back")
            }
        }
    }
)
This is with:
Copy code
composeBom = "2025.06.01"
material3 = "1.4.0-alpha17"
material3Adaptive = "1.2.0-alpha08"
I’ve also filed an issue here, but maybe I’m just doing something wrong here. https://issuetracker.google.com/issues/425223278