Post

四布局

一.基础类和继承结构

1.基础类

Widget对应的Element用途
LeafRenderObjectWidgetLeafRenderObjectElementWidget树的叶子节点,用于没有子节点的widget,通常基础组件都属于这一类,如Image。
SingleChildRenderObjectWidgetSingleChildRenderObjectElement包含一个子Widget,如:ConstrainedBox、DecoratedBox等
MultiChildRenderObjectWidgetMultiChildRenderObjectElement包含多个子Widget,一般都有一个children参数,接受一个Widget数组。如Row、Column、Stack等

2.继承结构

graph TD
    Widget-->A[RenderObjectWidget]
    A-->|LeafRenderObjectElement|C[LeafRenderObjectWidget]
    A-->|SingleChildRenderObjectElement|D[SingleChildRenderObjectWidget]
    A-->|MultiChildRenderObjectElement|E[MultiChildRenderObjectWidget]
    C-->C1[Image]
    D-->D1[ConstrainedBox/DecoratedBox]
    E-->E1[Row/Column/Stack]

二.Row、Column(线性布局)

公共属性:

属性作用其他
textDirection水平/垂直方向子组件的布局顺序(rtl/ltr)Locale环境的文本方向(如中文、英语都是从左往右,而阿拉伯语是从右往左)
verticalDirection垂直/水平方向子组件的布局顺序默认VerticalDirection.down:表示从上到下(从左到右)
up:与down相反
mainAxisSizeRow/Column在主轴(水平/垂直)方向占用的空间默认MainAxisSize.max:Row/Column的宽/高度始终等于水平/垂直方向的最大宽/高度
min:尽可能少的占用水平/垂直空间(Row的实际宽度=所有子组件占用的的水平空间)
mainAxisAlignment子组件在Row/Column所占用的水平/垂直空间内对齐方式textDirection是mainAxisAlignment的参考系
start:沿textDirection的初始方向对齐
end:则与start相反
center:居中对齐
当mainAxisSize=min时对于Row此属性无意义
crossAxisAlignment子组件在Row/Column所占用的垂直/水平空间内对齐方式verticalDirection是crossAxisAlignment的参考系
start:verticalDirection=down顶部/左边对齐,verticalDirection=up底部/右边对齐
end:和start相反

三.Flex

  • Row(direction: Axis.horizontal)、Column(direction: Axis.vertical)是Flex子类.顾除了direction Flex具有Row、Column的所有属性
  • 只有和Expanded(Space)组件配合才能实现Flex布局
  • Expanded
    • 1.flex属性:子组件所占用的空间(0或null,则child不会被扩伸占用的空间)

四.Wrap、Flow(流式布局)

  • 为什么需要Wrap、Flow?

    Row、Column的子widget超出屏幕范围flutter默认不能自适应换行,而是报溢出错误。

1.Wrap

属性作用其他
spacing主轴方向子widget的间距 
runSpacing纵轴方向的间距 
runAlignment纵轴方向的对齐方式 
direction、crossAxisAlignment、textDirection、verticalDirection参照Row、Column属性 

2.FLow

Flow提供了dalegate(FlowDelegate)的方式对子Widget的位置进行定位处理。主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景

  • FlowDelegate Flow.delegate必须提供FlowDelegate抽象类子类的实例。
函数作用
void paintChildren(FlowPaintingContext context)此方法中调用context.paintChild 进行重绘,而context.paintChild在重绘时使用了转换矩阵,并没有实际调整组件位置。
Size getSize(BoxConstraints constraints)指定Flow大小
bool shouldRepaint(covariant FlowDelegate oldDelegate)是否要重绘
BoxConstraints getConstraintsForChild(int i, BoxConstraints constraints)重写控制每个子widget的constraints

五.Stack、Positioned(层叠布局)

  • 单独Stack效果和android FrameLayout相同
  • 配合Positioned实现绝对布局

1.Stack

属性作用其他
alignment此参数决定如何去对齐没有定位(没有使用Positioned)或部分定位的子组件这里特指没有在某一个轴上定位:left、right为横轴,top、bottom为纵轴,
只要包含某个轴上的一个定位属性就算在该轴上有定位。
fit用于确定没有定位的子组件如何去适应Stack的大小StackFit.loose:使用子组件的大小
expand:扩伸到Stack的大小
overflow如何显示超出Stack显示空间的子组件Overflow.clip:超出部分会被剪裁(隐藏)
visible 时则不会
textDirection参考Row、Column-

2.Positioned(相当于android的AbsoluteLayout)

  • left、top 、right、 bottom分别代表离Stack左、上、右、底四边的距离
  • width和height用于指定需要定位元素的宽度和高度.left、width、right中width、right只能存在一个否则报错,同理top、height、bottom也是。

六.Align(相对定位)、Center

1.Align

A用于调整子组件的位置,并可根据子组件的宽高确定自身的的宽高

  • 主要属性
属性作用其他
alignment子组件在父组件中的起始位置使用Alignment定义的常量
widthFactor缩放因子,确定Align 组件本身宽度eg:子widget宽60,则Align的宽=widthFactor*widget
heightFactor缩放因子,确定Align 组件本身高度-
  • Alignment
  • FractionalOffset

2.Center

Align的子类并将alignment设置为Alignment.center

This post is licensed under CC BY 4.0 by the author.