Flutter核心Widget介绍(2)

190 阅读2分钟

Column

Column(
{Key key,
MainAxisAlignment mainAxisAlignment: MainAxisAlignment.start,
MainAxisSize mainAxisSize: MainAxisSize.max,
CrossAxisAlignment crossAxisAlignment: CrossAxisAlignment.center,
TextDirection textDirection,
VerticalDirection verticalDirection: VerticalDirection.down,
TextBaseline textBaseline,
List<Widget> children: const <Widget>[]}
)

介绍

一个在垂直方向上显示它的多个子级的Widget.

  • 要将子对象展开可以填充垂直方向上的可用空间,则需将子级对象包裹在Expandedwidget中.
  • Colunmwidget 不能滚动,一般来说,如果考虑将多个子级对象放在Colunm中且可用空间相对固定的情况下,则是一个错误的决定。如果有一系列widget,在空间不足且希望它能滚动,一般考虑使用ListView.
  • 水平方向的widget,参考Row
  • 如果仅有一个Child,则考虑使用AlignCenter来定位Child.

故障诊断

  1. 当然传入的垂直约束是无边界时
  • Column有一个或多个ExpandedFlexible子级,且放置在另一个ColumnListView,或其他不为该Cloumn提供最大高度约束的上下中时,则会在运行时产生一个异常(即存在具有非零伸缩的子级但垂直约束时无界的)
  • 使用Expanded 或Flexible后,意味着布局其他子对象后剩余空间必须平均共享,但是如果传入的垂直约束时无边界的,则还会剩余无穷尽的剩余空间.
  • 两种解决方法:增加或移除Expanded或Flexible
  1. The yellow and black striped banner出现黄黑相间的条幅
  • Column的内容超过可用空间时,Cloumn会溢出且内容会被裁切掉。在debug模式下,会溢出边缘出现黄黑相间的条纹已指示问题,且会打印Cloumn溢出多少.
  • 通常使用ListView来解决,当垂直空间有限时,已允许其滚动。

布局算法

  1. 使用无边界的垂直约束和传入的水平约束,为每个子级布局一个空的或零的弹性系数(例如,那些没有展开的子级)。
  2. 根据弹性系数,将弹性系数不为零的子级(例如,展开的子级)之间的剩余垂直空间分开。
  3. 使用与步骤1中相同的水平约束来布局其余的每个子级,但不要使用无界的垂直约束,而是根据步骤2中分配的空间量使用垂直约束。
  4. 列的宽度是子项的最大宽度(它将始终满足传入的水平约束)。
  5. 列的高度由mainAxisSize属性确定。
  • MainAxisSize.max : 列的高度为传入约束的最大高度
  • MainAxisSize.min : 列的高度为传入的所以子级的高度之和(受传入约束)
  1. 根据 mainAxiaAlignmentcrossAxisAlignment 属性确定每个子级的位置