Modifier

Cпособ изменить или дополнить поведение и внешний вид UI-компонентов (Composable). С помощью Modifier можно задавать размеры, отступы, фон, обработку жестов, анимации и многое другое, без изменения самого компонента. Это позволяет легко комбинировать и переиспользовать стили и эффекты для разных элементов.

• Последовательность применения: Modifier применяются слева направо, то есть порядок важен.

then

Позволяет объединять несколько Modifier в один. Она полезна для создания цепочек модификаторов, так как позволяет добавлять или комбинировать дополнительные модификаторы, сохраняя порядок их применения.

val isClickable = true
val modifier = Modifier
    .padding(16.dp)
    .then(if (isClickable) Modifier.clickable { /* обработка клика */ } else Modifier)
Size
width(width: Dp)

Задает фиксированную ширину для компонента.

@Composable
fun FixedWidthBox() {
    Box(
        modifier = Modifier.width(100.dp)
    )
}
height(height: Dp)

Задает фиксированную высоту для компонента.

@Composable
fun FixedHeightBox() {
    Box(
        modifier = Modifier.height(100.dp)
    )
}
size(size: Dp)

Задает фиксированный размер (ширину и высоту) для компонента.

@Composable
fun SquareBox() {
    Box(
        modifier = Modifier.size(100.dp)
    )
}
size(width: Dp, height: Dp)

Задает фиксированную ширину и высоту для компонента, используя разные значения для каждой из них.

@Composable
fun RectangleBox() {
    Box(
        modifier = Modifier.size(width = 120.dp, height = 60.dp)
    )
}
size(size: DpSize)

Позволяет установить ширину и высоту компонента с помощью объекта DpSize.

@Composable
fun RectangleBox() {
    val boxSize = DpSize(width = 120.dp, height = 60.dp)

    Box(
        modifier = Modifier.size(boxSize)
    )
}
widthIn(min: Dp, max: Dp)

Задает минимальную и максимальную ширину для компонента.

@Composable
fun LimitedWidthBox() {
    Box(
        modifier = Modifier.widthIn(min = 100.dp, max = 200.dp)
    )
}
heightIn(min: Dp, max: Dp)

Задает минимальную и максимальную высоту для компонента.

@Composable
fun LimitedHeightBox() {
    Box(
        modifier = Modifier.heightIn(min = 100.dp, max = 200.dp)
    )
}
sizeIn(minWidth: Dp, minHeight: Dp, maxWidth: Dp, maxHeight: Dp)

Задает минимальный и максимальный размер (ширину и высоту) для компонента.

@Composable
fun LimitedSizeBox() {
    Box(
        modifier = Modifier.sizeIn(minWidth = 100.dp, minHeight = 50.dp, maxWidth = 200.dp, maxHeight = 100.dp)
    )
}
requiredWidth(width: Dp)

Устанавливает фиксированную ширину для компонента, независимо от других модификаторов. В отличие от width, который может быть переопределен другими модификаторами (например, widthIn или sizeIn), requiredWidth устанавливает фиксированную ширину, которая игнорирует любые другие ограничения.

@Composable
fun RequiredWidthBox() {
    Box(
        modifier = Modifier.requiredWidth(150.dp)
    )
}
requiredHeight(height: Dp)

Устанавливает фиксированную высоту для компонента, независимо от других модификаторов. В отличие от height, который может быть переопределен другими модификаторами (например, heightIn или sizeIn), requiredHeight устанавливает фиксированную высоту, которая игнорирует любые другие ограничения.

@Composable
fun RequiredHeightBox() {
    Box(
        modifier = Modifier.requiredHeight(100.dp)
    )
}
requiredSize(size: Dp)

Устанавливает фиксированный размер (ширину и высоту) для компонента, независимо от других модификаторов. В отличие от size, который может быть переопределен другими модификаторами (например, sizeIn), requiredSize устанавливает фиксированный размер, который игнорирует любые другие ограничения.

@Composable
fun RequiredSizeBox() {
    Box(
        modifier = Modifier.requiredSize(100.dp)
    )
}
requiredSize(width: Dp, height: Dp)

Устанавливает фиксированную ширину и высоту для компонента, независимо от других модификаторов. В отличие от size, который может быть переопределен другими модификаторами (например, sizeIn), requiredSize устанавливает фиксированный размер, который игнорирует любые другие ограничения.

@Composable
fun RequiredSizeBox() {
    Box(
        modifier = Modifier.requiredSize(width = 120.dp, height = 80.dp)
    )
}
requiredWidthIn(min: Dp, max: Dp)

Задает обязательные минимальную и максимальную ширину для компонента. В отличие от widthIn, который может быть переопределен другими модификаторами, requiredWidthIn устанавливает строгие ограничения по ширине, которые не могут быть изменены другими модификаторами.

@Composable
fun RequiredWidthInBox() {
    Box(
        modifier = Modifier.requiredWidthIn(min = 100.dp, max = 200.dp)
    )
}
requiredHeightIn(min: Dp, max: Dp)

Задает обязательные минимальную и максимальную высоту для компонента. В отличие от heightIn, который может быть переопределен другими модификаторами, requiredHeightIn устанавливает строгие ограничения по высоте, которые не могут быть изменены другими модификаторами.

@Composable
fun RequiredHeightInBox() {
    Box(
        modifier = Modifier.requiredHeightIn(min = 50.dp, max = 150.dp)
    )
}
requiredSizeIn(minWidth: Dp, minHeight: Dp, maxWidth: Dp, maxHeight: Dp)

Задает обязательные минимальные и максимальные значения как для ширины, так и для высоты компонента. В отличие от sizeIn, который может быть переопределен другими модификаторами, requiredSizeIn устанавливает строгие ограничения по ширине и высоте, которые не могут быть изменены другими модификаторами.

@Composable
fun RequiredSizeInBox() {
    Box(
        modifier = Modifier.requiredSizeIn(minWidth = 100.dp, minHeight = 50.dp, maxWidth = 200.dp, maxHeight = 100.dp)
    )
}
fillMaxWidth(fraction: Float)

Заставляет компонент занять определенную долю доступной ширины родительского контейнера.

fraction определяет долю ширины, которую должен занять компонент. Значение должно быть в диапазоне от 0.0 до 1.0, где 0.0 означает, что компонент не займет никакой ширины, а 1.0 — что он займет всю доступную ширину. Значение по умолчанию — 1.0, то есть компонент будет занимать всю ширину контейнера. fraction = 0.5F означает, что компонент займет 50% доступной ширины контейнера.

@Composable
fun FullWidthBox() {
    Box(
        modifier = Modifier.fillMaxWidth()
    )
}
@Composable
fun HalfWidthBox() {
    Box(
        modifier = Modifier.fillMaxWidth(fraction = 0.5F)
    )
}
fillMaxHeight(fraction: Float)

Заставляет компонент занять определенную долю доступной высоты родительского контейнера.

fraction определяет долю высоты, которую должен занять компонент. Значение должно быть в диапазоне от 0.0 до 1.0, где 0.0 означает, что компонент не займет никакой высоты, а 1.0 — что он займет всю доступную высоту контейнера. Значение по умолчанию — 1.0, то есть компонент будет занимать всю высоту контейнера. fraction = 0.5F означает, что компонент займет 50% доступной высоты контейнера.

@Composable
fun FullHeightBox() {
    Box(
        modifier = Modifier.fillMaxHeight()
    )
}
@Composable
fun HalfHeightBox() {
    Box(
        modifier = Modifier.fillMaxHeight(0.5F)
    )
}
fillMaxSize(fraction: Float)

Заставляет компонент занять определенную долю доступного пространства как по ширине, так и по высоте родительского контейнера.

fraction определяет долю ширины и высоты, которую должен занять компонент. Значение должно быть в диапазоне от 0.0 до 1.0, где 0.0 означает, что компонент не займет никакого пространства, а 1.0 — что он займет всю доступную ширину и высоту контейнера. Значение по умолчанию — 1.0, то есть компонент будет занимать все доступное пространство. fraction = 0.5F означает, что компонент займет 50% ширины и 50% высоты родительского контейнера.

@Composable
fun FullSizeBox() {
    Box(
        modifier = Modifier.fillMaxSize()
    )
}
@Composable
fun HalfSizeBox() {
    Box(
        modifier = Modifier.fillMaxSize(0.5F)
    )
}
wrapContentWidth(align: Alignment.Horizontal, unbounded: Boolean)

Заставляет компонент занимать минимально возможную ширину, необходимую для отображения его содержимого. В отличие от fillMaxWidth, который заполняет всю доступную ширину, wrapContentWidth позволяет компоненту «обернуться» вокруг содержимого, при этом можно задать горизонтальное выравнивание и поведение за пределами ограничений.

align определяет горизонтальное выравнивание компонента внутри доступного пространства. Это значение задается с помощью Alignment.Horizontal, и может быть, например, Alignment.Start, Alignment.CenterHorizontally или Alignment.End. Оно управляет тем, как компонент будет выровнен внутри выделенной ему ширины, если доступное пространство больше минимально необходимого.

unbounded логическое значение, которое определяет, может ли компонент игнорировать ограничения по ширине. Если unbounded установлен в true, компонент может занимать больше места, чем доступно (например, текст может выходить за пределы экрана). Обычно этот параметр оставляют false для стандартного поведения, когда размер ограничен границами родительского контейнера.

@Composable
fun WrapContentWidthBox() {
    Box(
        modifier = Modifier.wrapContentWidth(align = Alignment.CenterHorizontally, unbounded = false)
    )
}
wrapContentHeight(align: Alignment.Vertical, unbounded: Boolean)

Заставляет компонент занимать минимально возможную высоту, необходимую для отображения его содержимого. В отличие от fillMaxHeight, который заполняет всю доступную высоту, wrapContentHeight позволяет компоненту «обернуться» вокруг содержимого, при этом можно задать вертикальное выравнивание и поведение за пределами ограничений.

align определяет вертикальное выравнивание компонента внутри доступного пространства. Это значение задается с помощью Alignment.Vertical, и может быть, например, Alignment.Top, Alignment.CenterVertically или Alignment.Bottom. Выравнивание управляет тем, как компонент будет располагаться внутри выделенной ему высоты, если доступное пространство больше минимально необходимого.

unbounded логическое значение, которое определяет, может ли компонент игнорировать ограничения по высоте. Если unbounded установлен в true, компонент может занимать больше места, чем доступно (например, длинный текст может выходить за пределы контейнера). Обычно unbounded оставляют false для стандартного поведения, когда размер ограничен границами родительского контейнера.

@Composable
fun WrapContentHeightBox() {
    Box(
        modifier = Modifier.wrapContentHeight(align = Alignment.CenterVertically, unbounded = false)
    )
}
wrapContentSize(align: Alignment, unbounded: Boolean)

Заставляет компонент занимать минимально возможный размер (ширину и высоту), необходимый для отображения его содержимого. В отличие от fillMaxSize, который заполняет все доступное пространство, wrapContentSize позволяет компоненту «обернуться» вокруг содержимого, при этом можно задать выравнивание и поведение за пределами ограничений как по ширине, так и по высоте.

align определяет выравнивание компонента внутри доступного пространства. Использует объект Alignment, который задает как горизонтальное, так и вертикальное выравнивание. Примеры значений: Alignment.TopStart, Alignment.Center, Alignment.BottomEnd и другие. Это позволяет расположить компонент в нужной позиции, если доступное пространство больше, чем минимально необходимое.

unbounded логическое значение, которое определяет, может ли компонент игнорировать ограничения по размеру. Если unbounded установлен в true, компонент может занимать больше места, чем доступно (например, текст может выйти за пределы контейнера). Обычно unbounded оставляют false для стандартного поведения, когда размер ограничен границами родительского контейнера.

@Composable
fun WrapContentSizeBox() {
    Box(
        modifier = Modifier.wrapContentSize(align = Alignment.Center, unbounded = false)
    )
}
defaultMinSize(minWidth: Dp, minHeight: Dp)

Устанавливает минимальные размеры (ширину и/или высоту) для компонента, если его содержимое занимает меньше места, чем указанные значения. В отличие от модификаторов вроде requiredSize, defaultMinSize применяется только тогда, когда содержимое компонента меньше минимальных размеров, и не заставляет компонент всегда занимать это пространство. Этот модификатор удобен, когда нужно задать минимальные размеры для компонента, но при этом оставить его адаптивным, если содержимое занимает больше места.

@Composable
fun DefaultMinSizeBox() {
    Box(
        modifier = Modifier.defaultMinSize(minWidth = 100.dp, minHeight = 50.dp)
    )
}
Вопросы на собесе (1)
  1. В чем особенность Modifier?

    Каждый вызов модификатора возвращает новый объект, что способствует декларативному стилю разработки и позволяет легко комбинировать несколько модификаторов, а также наследовать их. Порядок операторов также имеет значение.