线性布局

  • 所谓线性布局,即指沿水平或垂直方向排布子组件
  • Row和Column都继承自Flex
  • Row和Column都只会在主轴方向占用尽可能大的空间,而纵轴的长度则取决于他们最大子元素的长度。

例子:在contain内使用row,无论我们如何构建区域,在区域的最外面都会有一个大盒子将区域的所有内容包裹起来。在html里面我们使用div,在flutter里面,我们使用Container

Android studio flutter 布局预览 flutter各种布局_边距


在每个部件当中,肯定会有子节点,你要么是单个子节点,要么是多个子节点。

两个子节点分别使用child、children进行描述,column或者row就是Container的子节点。

注意:在没有子节点的基础,Container这个容器会尽可能放到最大,如果有子节点,那么,它将会变得足够的小。

Android studio flutter 布局预览 flutter各种布局_子节点_02


Alignment

控制子元素在自身容器的位置

topLeft:靠左上角

则,Container沾满所有的父级区域

ROW

Android studio flutter 布局预览 flutter各种布局_边距_03


Row默认是占了container主轴方向最最大的距离。比如是水平方向,则它在水平方向占一行的区域

主轴方向对齐方式

对齐属性
mainAxisAlignment

向第一个元素对齐(默认)

Android studio flutter 布局预览 flutter各种布局_子节点_04


向最后的一个元素对齐

Android studio flutter 布局预览 flutter各种布局_流式布局_05


居中对齐

Android studio flutter 布局预览 flutter各种布局_reactjs_06


除了以上的对齐方式,还支持css3flex属性两端对齐,左右两头靠左右

Android studio flutter 布局预览 flutter各种布局_流式布局_07


各个子元素的边距相等

Android studio flutter 布局预览 flutter各种布局_子节点_08


两端的边距是子元素之间边距的1/2

Android studio flutter 布局预览 flutter各种布局_边距_09

垂直对齐方式

排列方位特点,是上中下

Android studio flutter 布局预览 flutter各种布局_流式布局_10


以中心点作为参考点

Android studio flutter 布局预览 flutter各种布局_reactjs_11


以顶部作为参考点

Android studio flutter 布局预览 flutter各种布局_流式布局_12


以底部作为参考点

Android studio flutter 布局预览 flutter各种布局_reactjs_13

排列顺序

一般是从左到右,可更改为从右到左

Android studio flutter 布局预览 flutter各种布局_reactjs_14


本来是从上到下,添加如下属性,则会变成从下到上

Android studio flutter 布局预览 flutter各种布局_边距_15


注意:

Row对齐属性失效原因:row没有设置为最大,如果是设置最小值,则不会有间距,没有间距,alignment可能会失效

Android studio flutter 布局预览 flutter各种布局_边距_16

Column垂直方向

使用场景:商品列表

宽度是由内容撑开,高度则撑满整个高度。

Android studio flutter 布局预览 flutter各种布局_流式布局_17


设置宽度为最小值

Android studio flutter 布局预览 flutter各种布局_reactjs_18


设置宽度占满一行

Android studio flutter 布局预览 flutter各种布局_子节点_19


Android studio flutter 布局预览 flutter各种布局_子节点_20


两端对齐

Android studio flutter 布局预览 flutter各种布局_边距_21


上下边距为子元素之间间距的1/2

Android studio flutter 布局预览 flutter各种布局_子节点_22


所有间距都相等

Android studio flutter 布局预览 flutter各种布局_子节点_23


Android studio flutter 布局预览 flutter各种布局_流式布局_24


以相反方向进行对齐

Android studio flutter 布局预览 flutter各种布局_流式布局_25


其他属性参考Row,在开发中,使用Row/Column比较多,因为他们是flex的子元素

参考列表
a). Row

  • 主轴是水平方向
  • 在水平方向如何排版
  • textDirection:表示水平方向子组件的布局顺序(是从左往右还是从右往左)。
  • mainAxisSize:表示Row在主轴(水平)方向占用的空间,默认是
  • MainAxisSize.max,表示尽可能多的占用水平方向的空间,此时无论子widgets实际占用多少水平空间,Row的宽度始终等于水平方向的最大宽度;而
  • MainAxisSize.min表示尽可能少的占用水平空间,当子组件没有占满水平剩余空间,则Row的实际宽度等于所有子组件占用的的水平空间;
  • mainAxisAlignment:表示子组件在Row所占用的水平空间内对齐方式,如果mainAxisSize值为MainAxisSize.min,则此属性无意义,因为子组件的宽度等于Row的宽度。只有当mainAxisSize的值为MainAxisSize.max时,此属性才有意义,MainAxisAlignment.start表示沿textDirection的初始方向对齐,如textDirection取值为TextDirection.ltr时,则MainAxisAlignment.start表示左对齐,textDirection取值为TextDirection.rtl时表示从右对齐。而MainAxisAlignment.end和
    MainAxisAlignment.start正好相反;MainAxisAlignment.center表示居中对齐。
    verticalDirection:表示Row纵轴(垂直)的对齐方向,默认是VerticalDirection.down,表示从上到下。
    crossAxisAlignment:表示子组件在纵轴方向的对齐方式,Row的高度等于子组件中最高的子元素高度,它的取值和MainAxisAlignment一样(包含start、end、 center三个值),不同的是crossAxisAlignment的参考系是verticalDirection,即verticalDirection值为VerticalDirection.down时crossAxisAlignment.start指顶部对齐,verticalDirection值为VerticalDirection.up时,crossAxisAlignment.start指底部对齐;而crossAxisAlignment.end和crossAxisAlignment.start正好相反;
    children :子组件数组。

b). Column

  • 主轴是垂直方向
  • 在垂直方向如何布局
  • 属性和Row部件一致

弹性布局

  • 弹性布局允许子组件按照一定比例来分配父容器空间。
  • Flutter中的弹性布局主要通过Flex和Expanded来配合实现。

a) Flex

  • 组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方向,使用Row或Column会方便一些,因为Row和Column都继承自Flex,参数基本相同,所以能使用Flex的地方基本上都可以使用Row或Column。
  • Flex本身功能是很强大的,它也可以和Expanded组件配合实现弹性布局。
Flex({
  ...
  @required this.direction, //弹性布局的方向, Row默认为水平方向,Column默认为垂直方向
  List<Widget> children = const <Widget>[],
})

b). Expanded

  • 可以按比例“伸缩” Row、Column和Flex子组件所占用的空间。
  • flex参数为弹性系数,如果为0或null,则child是没有弹性的,即不会被扩伸占用的空间。如果大于0,所有的Expanded按照其flex的比例来分割主轴的全部空闲空间
const Expanded({
  int flex = 1, 
  @required Widget child,
})

流式布局

Android studio flutter 布局预览 flutter各种布局_边距_26


使用场景:首页导航按钮、瀑布流

  • 在一些地方,如果子widget超出屏幕范围不会折行,则会报溢出错误
  • 我们把超出屏幕显示范围会自动折行的布局称为流式布局
  • Flutter中通过Wrap和Flow来支持流式布局,溢出会折行排版
  • 属性基本和Flex(包括Row和Column)一致
  • 我们一般很少会使用Flow,因为其过于复杂,需要自己实现子widget的位置转换,一般用Wrap满足需求。
  • Flow主要用于一些需要自定义布局策略或性能要求较高(如动画中)的场景

spacing:主轴方向子widget的间距
runSpacing:纵轴方向的间距
runAlignment:纵轴方向的对齐方式

使用场景:

使用row 如果宽度超过屏幕宽度,则会出现溢出错误

Android studio flutter 布局预览 flutter各种布局_流式布局_27


则这是,我们就会使用wrap

Android studio flutter 布局预览 flutter各种布局_流式布局_28


控制子元素之间的边距

spacing :控制子元素之间的距离

Android studio flutter 布局预览 flutter各种布局_reactjs_29


Android studio flutter 布局预览 flutter各种布局_reactjs_30


主轴方向从左到右边

Android studio flutter 布局预览 flutter各种布局_边距_31


Android studio flutter 布局预览 flutter各种布局_流式布局_32

层叠布局(绝对定位)

Android studio flutter 布局预览 flutter各种布局_子节点_33


Android studio flutter 布局预览 flutter各种布局_流式布局_34


stack父元素

positioned子元素

Android studio flutter 布局预览 flutter各种布局_流式布局_35


Android studio flutter 布局预览 flutter各种布局_reactjs_36

相对定位

Android studio flutter 布局预览 flutter各种布局_reactjs_37