Positioned
This page has not been translated into English yet. The Russian original is below.
Ставит ребёнка в Stack по абсолютным координатам: отступы от краёв и/или явный размер. Используется для бейджей, кнопок «закрыть», подписей поверх изображения.
Тип:
single-child
Stack
SizedBox width:200 height:120
ColoredBox color:#36345E
Positioned top:8 right:8
Text "NEW"
Работает
только
непосредственно внутри
Stack
.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
top
|
длина |
Отступ от верхнего края
Stack
|
bottom
|
длина | Отступ от нижнего края |
left
|
длина | Отступ от левого края |
right
|
длина | Отступ от правого края |
width
|
длина | Ширина |
height
|
длина | Высота |
Все параметры необязательны, неуказанные стороны остаются свободными. Длина — число (пиксели) или строка с единицей:
"50%"
,
"10svh"
(процент считается по своей оси, как в CSS:
left
/
right
от ширины,
top
/
bottom
от высоты).
Задав одновременно
left
и
right
(или
top
и
bottom
), вы растягиваете ребёнка на всё расстояние между ними — ширину (высоту) тогда писать не нужно.
Примеры
Подпись поверх картинки
Stack
SizedBox width:320 height:180
Image src:"https://example.com/poster.jpg" fit:cover
Positioned left:12 right:12 bottom:12
Text "Название фильма"
Затемнение на всю ширину
Stack
SizedBox width:320 height:180
ColoredBox color:#585593
Positioned bottom:0 left:0 right:0 height:60
ColoredBox color:#99000000
Кнопка закрытия в углу
@opened:true
Stack
SizedBox width:240 height:140
ColoredBox color:#1e1b4b
Positioned top:4 right:4
InkWell onTap:{opened = false}
Padding
#padding all 8
Icon close
Различия между приложением и сайтом
На сайте
Positioned
всегда становится абсолютно позиционированным блоком; если ребёнок занимает всю область, он заполняет её (как во Flutter, где у ребёнка с размером жёсткие ограничения). Прочих отличий нет.
Bad practices
Positioned вне Stack
// BAD — Positioned не в Stack не имеет смысла: во Flutter это ошибка
Column
Positioned top:8 left:8
Text "Бейдж"
// GOOD — родитель Stack
Stack
SizedBox width:100 height:100
ColoredBox color:#36345E
Positioned top:8 left:8
Text "Бейдж"
Best practices
-
Задайте размер
Stackобычным (неPositioned) ребёнком —SizedBoxили картинкой. РазмерStackопределяют именно непозиционированные дети; без такогоPositionedне от чего отсчитываться. -
Для простого выравнивания одного элемента (по центру, в угол) хватает
alignmentуStackили Align —Positionedнужен, когда нужны точные отступы.