布局规则
Flutter 布局中存下以下规则:
- 首先,上层 Widget 向下层 Widget 传递约束条件(向下传递约束)
- 其次,下层 Widget 向上层 Widget 传递大小信息(向上传递尺寸)
- 最后,上层 Widget 决定下层 Widget 的位置(上层决定位置)
详细描述整个布局流程如下:
- Widget 会通过它的父级获得自身约束。约束实际上就是 4 个浮点类型的集合:最大/最小宽度,以及最大/最小高度。
- 然后这个 Widget 将会逐个遍历它的 children 列表,向子级传递约束(子级之间的约束可能会有不同),然后询问它的每一个子级需要用于布局的大小。
- 然后这个 Widget 将会对它子级 children 逐个进行布局。
- 最后,Widget 将会把它的大小信息向上传递至父 Widget(包括其原始约束条件)。
约束
约束实际上就是 4 个浮点类型的集合:最大/最小宽度,以及最大/最小高度,分为紧约束tight、松约束loose以及无约束unbonded
紧约束
严格约束就是获得确切大小的选择,换句话来说,它的最大/最小宽度是一致的,高度也是一样。
// flutter/lib/src/rendering/box.dart
BoxConstraints.tight(Size size)
: minWidth = size.width,
maxWidth = size.width,
minHeight = size.height,
maxHeight = size.height;
松约束
宽松约束就是设置了最大宽度/高度,但是允许其子 Widget 获得比它更小的任意大小,换句话说就是宽松约束的最小宽度/高度为 0。
BoxConstraints.loose(Size size)
: minWidth = 0.0,
maxWidth = size.width,
minHeight = 0.0,
maxHeight = size.height;
无约束
显然就是不给子元素施加任何约束, UnconstrainedBox就是一个无约束盒子
const UnconstrainedBox({
super.key,
this.child,
this.textDirection,
this.alignment = Alignment.center,
this.constrainedAxis,
this.clipBehavior = Clip.none,
});
Row、Column分别在行和列上无约束,但需要注意的一点是,无约束的情况下容易导致子元素超出