Sean Proctor
02/16/2024, 11:53 PMSean Proctor
02/16/2024, 11:58 PM@Composable
actual fun ScrollableColumnImpl(
modifier: Modifier,
verticalArrangement: Arrangement.Vertical,
horizontalAlignment: Alignment.Horizontal,
content: @Composable ColumnScope.() -> Unit
) {
Box(modifier) {
val state = rememberScrollState()
val adapter = rememberScrollbarAdapter(state)
val isScrollbarVisible = adapter.viewportSize < adapter.contentSize
Column(
modifier = Modifier.fillMaxSize()
.padding(end = if (isScrollbarVisible) LocalScrollbarStyle.current.thickness else 0.dp)
.verticalScroll(state),
verticalArrangement = verticalArrangement,
horizontalAlignment = horizontalAlignment,
content = content,
)
if (isScrollbarVisible) {
VerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = adapter,
)
}
}
}
I don't like the .fillMaxSize()
, but most of my usages want it, and I can't find another way to do it. Maybe using Layout
here would make sense.Sean Proctor
02/17/2024, 4:35 AMSean Proctor
02/17/2024, 4:35 AM@Composable
actual fun ScrollableColumnImpl(
modifier: Modifier,
verticalArrangement: Arrangement.Vertical,
horizontalAlignment: Alignment.Horizontal,
content: @Composable ColumnScope.() -> Unit
) {
val state = rememberScrollState()
val adapter = rememberScrollbarAdapter(state)
val isScrollbarVisible = adapter.viewportSize < adapter.contentSize
Layout(
content = {
Column(
modifier = Modifier
.padding(end = if (isScrollbarVisible) LocalScrollbarStyle.current.thickness else 0.dp)
.verticalScroll(state),
verticalArrangement = verticalArrangement,
horizontalAlignment = horizontalAlignment,
content = content,
)
if (isScrollbarVisible) {
VerticalScrollbar(
adapter = adapter,
)
}
},
modifier = modifier,
) { measurables, constraints ->
val columnPlaceable = measurables[0].measure(constraints)
val scrollbarPlaceable = measurables.getOrNull(1)?.measure(
Constraints(maxHeight = constraints.maxHeight, maxWidth = constraints.maxWidth)
)
layout(columnPlaceable.width, columnPlaceable.height) {
columnPlaceable.place(0, 0)
scrollbarPlaceable?.place(columnPlaceable.width - scrollbarPlaceable.width, 0)
}
}
}
Sean Proctor
02/17/2024, 11:48 AMMike Dawson
02/17/2024, 5:59 PMSean Proctor
02/17/2024, 7:13 PMfillMaxSize
to your Android implementation, otherwise if you don't add it where you call this, you're going to have a difference between Android and desktop.Sean Proctor
02/17/2024, 7:20 PMSean Proctor
02/17/2024, 7:51 PM