Use SubcomposeLayout for ContentAvoidingLayout (#2171)
Use `SubcomposeLayout` for `ContentAvoidingLayout`
This commit is contained in:
parent
0e3f0ac6b5
commit
00c27ffafc
2 changed files with 6 additions and 9 deletions
1
changelog.d/2155.bugfix
Normal file
1
changelog.d/2155.bugfix
Normal 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.
|
||||||
|
|
@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.layout.Layout
|
import androidx.compose.ui.layout.Layout
|
||||||
|
import androidx.compose.ui.layout.SubcomposeLayout
|
||||||
import androidx.compose.ui.platform.LocalLayoutDirection
|
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||||
import androidx.compose.ui.text.TextLayoutResult
|
import androidx.compose.ui.text.TextLayoutResult
|
||||||
import androidx.compose.ui.unit.Constraints
|
import androidx.compose.ui.unit.Constraints
|
||||||
|
|
@ -58,23 +59,18 @@ fun ContentAvoidingLayout(
|
||||||
) {
|
) {
|
||||||
val scope = remember { ContentAvoidingLayoutScopeInstance() }
|
val scope = remember { ContentAvoidingLayoutScopeInstance() }
|
||||||
|
|
||||||
Layout(
|
SubcomposeLayout(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
content = {
|
) { constraints ->
|
||||||
scope.content()
|
|
||||||
overlay()
|
|
||||||
}
|
|
||||||
) { measurables, constraints ->
|
|
||||||
assert(measurables.size == 2) { "ContentAvoidingLayout must have exactly 2 children" }
|
|
||||||
|
|
||||||
// Measure the `overlay` view first, in case we need to shrink the `content`
|
// 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) {
|
val contentConstraints = if (shrinkContent) {
|
||||||
Constraints(minWidth = 0, maxWidth = constraints.maxWidth - overlayPlaceable.width)
|
Constraints(minWidth = 0, maxWidth = constraints.maxWidth - overlayPlaceable.width)
|
||||||
} else {
|
} else {
|
||||||
Constraints(minWidth = 0, maxWidth = constraints.maxWidth)
|
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 layoutWidth = contentPlaceable.width
|
||||||
var layoutHeight = contentPlaceable.height
|
var layoutHeight = contentPlaceable.height
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue