Работал ли с функцией Layout в Jetpack Compose

Ответ

Да, работал. Layout — это низкоуровневая функция Compose для создания кастомных лейаутов. Она позволяет вручную измерять и размещать дочерние элементы.

Пример:

@Composable
fun CustomLayout(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Layout(
        modifier = modifier,
        content = content
    ) { measurables, constraints ->
        // Измеряем дочерние элементы
        val placeables = measurables.map { it.measure(constraints) }
        // Вычисляем размер лейаута
        val width = placeables.sumOf { it.width }
        val height = placeables.maxOfOrNull { it.height } ?: 0
        // Размещаем дочерние элементы
        layout(width, height) {
            var x = 0
            placeables.forEach { placeable ->
                placeable.placeRelative(x, 0)
                x += placeable.width
            }
        }
    }
}

Используется, когда стандартные Row, Column или Box не подходят. Например, для сложных анимаций или нестандартного позиционирования.

Ответ 18+ 🔞

А, ну это ж классика! Да, работал, конечно, с этим Layout. Это же, ёпта, как залезть под капот всей этой композной магии — там уже не Row с Column, которые всё за тебя делают, а прям голые руки, измерительная рулетка и молоток.

Смотри, вот пример, чтобы было понятно, как это выглядит изнутри:

@Composable
fun CustomLayout(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Layout(
        modifier = modifier,
        content = content
    ) { measurables, constraints ->
        // Тут начинается цирк. Каждую детальку меряем.
        val placeables = measurables.map { it.measure(constraints) }
        // Считаем, какого же размера будет наша самопальная конструкция.
        val width = placeables.sumOf { it.width }
        val height = placeables.maxOfOrNull { it.height } ?: 0
        // А теперь расставляем всё по полочкам, как бог на душу положит.
        layout(width, height) {
            var x = 0
            placeables.forEach { placeable ->
                placeable.placeRelative(x, 0)
                x += placeable.width
            }
        }
    }
}

Честно говоря, выглядит страшновато только первый раз. Потом привыкаешь. Это как собрать мебель из Икеи без инструкции — сначала нихуя не понятно, а потом вроде как получается, и даже гордишься собой.

Зачем это всё, спросишь? Да когда эти готовые Row, Column или Box — полные пидарасы шерстяные и не могут сделать то, что тебе надо. Ну вот представь: тебе нужно не просто в ряд или столбик, а какую-нибудь хитрожопую спираль нарисовать, или элементы чтобы по кругу летали, или ещё какую дичь анимировать, на которую стандартные контейнеры смотрят как баран на новые ворота. Вот тут-то Layout и выручает — полная свобода, делай что хочешь. Но и ответственность, блядь, полная: просчитаешь размеры криво — и всё, пизда рулю, интерфейс разъедется как дерьмо по волнам.