Введение
Container
Это виджет, состоящий из множества виджетов контейнерного класса (DecoratedBox, ConstrainedBox, Transform, Padding, Align и т. д.), поэтому его функцию можно назвать набором функций.
Positioned
Это виджет, расположенный в макете стека, такой же, как в CSS.position:absolute;
сходство
Позиционирование контейнера в позиции
Во флаттере контейнер Container по умолчанию обычно занимает все пространство. Что происходит, когда Positioned использует Container?
- сегмент кода
....
....
@override
Widget build(BuildContext context) {
return Container(
color: Colors.blue,
child: Stack(
children: <Widget>[
Positioned(
//主要分析的Container对象
child: Container(
//_keyRed 申明为全局变量 GlobalKey _keyRed = GlobalKey();
//用key绑定Container
key: _keyRed,
decoration: BoxDecoration(color: Colors.yellow),
child: Row(
children: <Widget>[
],
),
),
),
Positioned(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
MaterialButton(
elevation: 5.0,
padding: EdgeInsets.all(15.0),
color: Colors.grey,
child: Text("Get Sizes"),
onPressed: _getSizes,
),
MaterialButton(
elevation: 5.0,
color: Colors.grey,
padding: EdgeInsets.all(15.0),
child: Text("Get Positions"),
onPressed: _getPositions,
),
],
)),
],
),
);
//获取Positioned中Container渲染位置
_getPositions() {
final RenderBox renderBoxRed = _keyRed.currentContext.findRenderObject();
final positionRed = renderBoxRed.localToGlobal(Offset.zero);
print("POSITION of Red: $positionRed ");
}
//获取Positioned中Container大小
_getSizes() {
final RenderBox renderBoxRed = _keyRed.currentContext.findRenderObject();
final sizeRed = renderBoxRed.size;
print("SIZE of Red: $sizeRed");
}
- эффект отображенияЦвет Контейнера в Positioned желтый, но соответствующий интерфейс не отображается на интерфейсе, потому что Контейнер в это время подобен блочному элементу в HTML, который занимает всю строку, но не имеет высоты.Нажимайте кнопки Получить Sizes и Get Position для вывода позиции контейнера и размера
I/flutter (27566): SIZE of Red: Size(360.0, 0.0)
I/flutter (27566): POSITION of Red: Offset(0.0, 0.0)
Добавить в контейнерheight: 50.0
I/flutter (27566): SIZE of Red: Size(360.0, 50.0)
I/flutter (27566): POSITION of Red: Offset(0.0, 0.0)
- Поместите контейнер на дно
bottom:0
Контейнер снова исчез, плюсbottom:0
После позиционирования значения это похоже на абсолютное позиционирование элемента уровня блока в HTML.position:absolute;
Значение ширины и высоты по умолчанию равно 0.
I/flutter (27566): SIZE of Red: Size(0.0, 50.0)
I/flutter (27566): POSITION of Red: Offset(0.0, 542.0)
Добавьте ширину или добавьте дочерние элементы в контейнер
....
....
//用key绑定Container
key: _keyRed,
decoration: BoxDecoration(color: Colors.yellow),
child: Row(
children: <Widget>[
Text('222 '),
Text('333'),
],
),
I/flutter (27566): SIZE of Red: Size(203.0, 50.0)
I/flutter (27566): POSITION of Red: Offset(0.0, 542.0)
Попробуйте добавить маржу в контейнерmargin: EdgeInsets.only(bottom: 50.0,right: 10.0)
I/flutter (27566): SIZE of Red: Size(213.0, 100.0)
I/flutter (27566): POSITION of Red: Offset(0.0, 492.0)
// padding: EdgeInsets.only(top: 50.0,left: 10.0),`
I/flutter (27566): SIZE of Red: Size(213.0, 50.0)
I/flutter (27566): POSITION of Red: Offset(0.0, 542.0)
- Значение поля накладывается на ширину и высоту
- отступы только слева и справа накладываются по ширине
Как сделать ширину контейнера полной и выровнять дно
Выравнивание вместо позиционирования
Align(
//对齐底部
alignment: Alignment.bottomCenter,
child: Container(
key: _keyRed,
decoration: BoxDecoration(color: Colors.yellow),
child: Row(
children: <Widget>[
Text('222 '),
Text('333'),
],
),
),
),
Используйте контейнер Align, чтобы сделать ширину контейнера полной, но высота по-прежнему равна 0 по умолчанию, поэтому эффект добавления дочерних элементов следующий:
Суммировать
- Вы можете использовать функции стека для позиционирования и компоновки, а также идеально использовать соответствующие свойства контейнера. Могут быть и другие более подходящие способы компоновки, добро пожаловать на обсуждение.
- Для получения статей о размере и положении контейнера перейдите к моему переводу.
- nuggets.capable/post/684490…