Flutter入门-布局与约束

195 阅读2分钟

布局规则

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分别在行和列上无约束,但需要注意的一点是,无约束的情况下容易导致子元素超出