In one of my composables, a Lazycolumn
is nested inside a Column
composable. I want to be able to scroll the entire Column
along with the Lazycolumn
. But, specifying the verticalScroll
modifier
property on Column
results in the following exception causing the app to crash. How can I fix this?
Exception
java.lang.IllegalStateException: Vertically scrollable component was measured with an infinity maximum height constraints, which is disallowed. One of the common reasons is nesting layouts like LazyColumn and Column(Modifier.verticalScroll()).
Composable
Column(
modifier = Modifier
.fillMaxWidth()
.verticalScroll(rememberScrollState())
.padding(bottom = 100.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
LazyColumn(
modifier = Modifier
.fillMaxWidth()
) {
items(
items = allItems!!,
key = { item ->
item.id
}
) { item ->
ShoppingListScreenItem(
navController = navController,
item = item,
sharedViewModel = sharedViewModel
) { isChecked ->
scope.launch {
shoppingListScreenViewModel.changeItemChecked(item!!, isChecked)
}
}
}
}
...
Button(
modifier = Modifier.padding(vertical = 24.dp),
onClick = {
navController.navigate(NavScreens.AddItemScreen.route) {
popUpTo(NavScreens.AddItemScreen.route) {
inclusive = true
}
}
}
) {
Text("Go to add item screen")
}
}
This happens when you wish to measure your
LazyColumn
withConstraints
withConstraints.Infinity
for the maxHeight which is not permitted as described in error log. There should be a fixed height or you shouldn't have another Scrollable with same orientation.If you don't know exact height you can assign
Modifier.weight(1f)
to LazyColumn.Contraints
This section is extra about `Constraints` and measurement you can skip this part if you are not interested in how it works.What i mean by measuring with with Constraints.Infinity is when you create a
Layout
in Compose you useYou get child Composables as
List<Measurable>
which you can measure withConstraints
provided by parent or the one you see fit by updating existing one withConstraints.copy
or fixed one when you build a custom Composable withLayout
.Constraints
min/max
width/height
changes based on size modifier or scroll. When there is a scroll and you don't use any size modifier,Constraints
return minHeight =0, maxHeight= Int.MAX_VALUE asConstraints.Infinity
Easiest way to check
Constraints
with different Modifiers or with scroll is getting it fromBoxWithConstraints