В Compose Foundation добавлен новый компонент FlexBox — полноценная реализация CSS Flexible Box Layout. Теперь вместо выбора между четырьмя разными контейнерами можно использовать один универсальный.
Сейчас для построения layouts в Compose приходится выбирать:
Row— элементы в строкуColumn— элементы в столбецFlowRow— строка с переносомFlowColumn— столбец с переносом
При этом у каждого свои ограничения. Например, во FlowRow нет нормального выравнивания по baseline, а переключение между Row и FlowRow требует смены компонента.
FlexBox объединяет всё это в едином API:
FlexBox(
config = FlexBoxConfig(
direction = FlexDirection.Row,
wrap = FlexWrap.Wrap,
justifyContent = JustifyContent.SpaceBetween,
alignItems = AlignItems.Center,
gap = 8.dp
)
) {
items.forEach { item ->
ItemCard(
modifier = Modifier.flex(
grow = 1f,
shrink = 0f,
basis = 120.dp
)
)
}
}На контейнере (FlexBoxConfig):
direction— направление основной оси (Row, Column, RowReverse, ColumnReverse)wrap— перенос элементов (NoWrap, Wrap, WrapReverse)justifyContent— распределение по основной осиalignItems— выравнивание по поперечной осиalignContent— выравнивание строк при переносеgap— отступы между элементами
На дочерних элементах (Modifier.flex):
grow— насколько элемент может растягиватьсяshrink— насколько элемент может сжиматьсяbasis— базовый размер до распределения пространстваorder— порядок отображения (независимо от порядка в коде)alignSelf— переопределение выравнивания для конкретного элемента
Если вы работали с CSS Flexbox — всё будет знакомо. Это практически 1:1 перенос модели в Compose.
Для тех, кто раньше городил вложенные Row/Column с весами и spacer'ами — теперь есть инструмент, который делает это декларативно и предсказуемо.
Компонент уже в androidx-main. Ждём в ближайших alpha-версиях Compose Foundation.