Use SubcomposeLayout for ContentAvoidingLayout (#2171)

Use `SubcomposeLayout` for `ContentAvoidingLayout`
This commit is contained in:
Jorge Martin Espinosa
2024-01-05 13:40:25 +01:00
committed by GitHub
parent 0e3f0ac6b5
commit 00c27ffafc
2 changed files with 6 additions and 9 deletions

1
changelog.d/2155.bugfix Normal file
View File

@@ -0,0 +1 @@
Use `SubomposeLayout` for `ContentAvoidingLayout` to prevent wrong measurements in the layout process, leading to cut-off text messages in the timeline.

View File

@@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.SubcomposeLayout
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.unit.Constraints
@@ -58,23 +59,18 @@ fun ContentAvoidingLayout(
) {
val scope = remember { ContentAvoidingLayoutScopeInstance() }
Layout(
SubcomposeLayout(
modifier = modifier,
content = {
scope.content()
overlay()
}
) { measurables, constraints ->
assert(measurables.size == 2) { "ContentAvoidingLayout must have exactly 2 children" }
) { constraints ->
// Measure the `overlay` view first, in case we need to shrink the `content`
val overlayPlaceable = measurables.last().measure(Constraints(minWidth = 0, maxWidth = constraints.maxWidth))
val overlayPlaceable = subcompose(0, overlay).first().measure(Constraints(minWidth = 0, maxWidth = constraints.maxWidth))
val contentConstraints = if (shrinkContent) {
Constraints(minWidth = 0, maxWidth = constraints.maxWidth - overlayPlaceable.width)
} else {
Constraints(minWidth = 0, maxWidth = constraints.maxWidth)
}
val contentPlaceable = measurables.first().measure(contentConstraints)
val contentPlaceable = subcompose(1) { scope.content() }.first().measure(contentConstraints)
var layoutWidth = contentPlaceable.width
var layoutHeight = contentPlaceable.height