mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 06:01:40 +00:00
Use SubcomposeLayout for ContentAvoidingLayout (#2171)
Use `SubcomposeLayout` for `ContentAvoidingLayout`
This commit is contained in:
committed by
GitHub
parent
e04780fbf6
commit
3a2191ee43
@@ -0,0 +1 @@
|
|||||||
|
Use `SubomposeLayout` for `ContentAvoidingLayout` to prevent wrong measurements in the layout process, leading to cut-off text messages in the timeline.
|
||||||
+5
-9
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user