← Назад к вопросам

Что такое FlowRow?

1.3 Junior🔥 141 комментариев
#Kotlin основы#UI и вёрстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое FlowRow в Jetpack Compose

FlowRow — это гибкий и мощный композибельный компонент в библиотеке Jetpack Compose UI, предназначенный для размещения элементов в горизонтальном направлении с возможностью переноса на следующую "строчку" при переполнении заданной ширины. Он является аналогом хорошо известного WrapContent поведения из традиционного View-системы или CSS flex-wrap, но реализован в рамках современной декларативной парадигмы Compose.

Основное предназначение и ключевые характеристики

FlowRow решает две основные задачи:

  • Горизонтальное расположение: Элементы располагаются последовательно слева направо.
  • Автоматический перенос: Когда суммарная ширина элементов в текущей строке превышает доступную ширину контейнера (FlowRow), следующий элемент автоматически перемещается на новую строку ниже. Это избавляет разработчика от необходимости заранее рассчитывать сложные конфигурации Row и Column.

Отличие от стандартных компонентов Row и LazyRow

  • Row: Располагает все дочерние элементы в одну горизонтальную линию без возможности переноса. Если содержимое превышает ширину, оно будет либо обрезано (в зависимости от Modifier), либо вызовет ошибку измерения.
  • LazyRow: Отображает только видимые элементы в горизонтальном направлении с поддержкой прокрутки, но также без переноса на новые строки.
  • FlowRow: Комбинирует горизонтальное направление с динамическим переносом, создавая адаптивный "поток" элементов, который идеально подходит для отображения коллекций с переменным или неизвестным заранее количеством элементов (например, списки тегов, фильтры, гибкие панели инструментов).

Базовый пример использования

@Composable
fun TagsFlow(tags: List<String>) {
    FlowRow(
        modifier = Modifier.fillMaxWidth(),
        horizontalArrangement = Arrangement.spacedBy(8.dp),
        verticalArrangement = Arrangement.spacedBy(8.dp),
        maxItemsInEachRow = 3 // Ограничение количества элементов в строке (опционально)
    ) {
        tags.forEach { tag ->
            Chip(
                modifier = Modifier.padding(4.dp),
                text = tag
            )
        }
    }
}

В этом примере список тегов (tags) будет динамически распределён по строкам. Если ширина контейнера недостаточна для размещения всех тегов в одну строку, они автоматически перенесутся на следующую.

Основные параметры (проperties) FlowRow

FlowRow предоставляет набор параметров для тонкого контроля над расположением:

FlowRow(
    modifier = Modifier,
    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
    verticalArrangement: Arrangement.Vertical = Arrangement.Top,
    maxItemsInEachRow: Int = Int.MAX_VALUE // Новый параметр для явного контроля
) {
    // Дочерние элементы
}
  • horizontalArrangement: Определяет расположение элементов внутри каждой строки (например, Arrangement.Start, Arrangement.Center, Arrangement.SpaceEvenly, Arrangement.spacedBy(8.dp)).
  • verticalArrangement: Определяет расположение самих строк относительно друг друга (Arrangement.Top, Arrangement.Center, Arrangement.spacedBy(4.dp)).
  • maxItemsInEachRow: Важный новый параметр. Позволяет задать жесткое ограничение на максимальное количество элементов в одной строке, даже если по ширине может поместиться больше. Это полезно для сохранения визуальной структуры.

Сравнение с FlowColumn

FlowColumn — это вертикальный аналог FlowRow. Элементы располагаются сверху вниз, и при переполнении высоты происходит перенос на следующую колонку (правее). Они составляют пару гибких компонентов для комплексной адаптивной разметки.

Практические сценарии применения

FlowRow наиболее полезен в следующих ситуациях:

  • Динамические списки тегов или категорий (например, в приложении для блога или магазина).
  • Гибкие панели инструментов или наборы действий, которые должны адаптироваться к разным ширинам экрана (планшет/телефон).
  • Отображение результатов поиска или коллекций элементов с переменным размером (например, карточки продуктов разной ширины).
  • Создание адаптивных форм или полей ввода, где несколько контролов должны переноситься на мобильных устройствах.

Таким образом, FlowRow является критически важным инструментом в арсенале разработчика Compose для создания отзывчивых (responsive) и адаптивных интерфейсов, которые корректно работают на устройствах с самой разной шириной экрана, без необходимости написания сложной логики измерения и ручного управления переносом элементов. Его использование значительно упрощает код и повышает его читаемость, полностью соответствуя философии Jetpack Compose.

Что такое FlowRow? | PrepBro