Almeric
07/04/2025, 6:11 AMListDetailPaneScaffold
and SecondaryTabRow
on the latest Material3/Material3Adaptive libraries?
I’m getting a crash when navigating from the listPane
to the detailPane
.Almeric
07/04/2025, 6:14 AMFATAL 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)
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")
}
}
}
)
Almeric
07/04/2025, 6:16 AMcomposeBom = "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