07-flutter的4种布局方式

线性布局

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

例子:在contain内使用row,无论我们如何构建区域,在区域的最外面都会有一个大盒子将区域的所有内容包裹起来。在html里面我们使用div,在flutter里面,我们使用Container
在这里插入图片描述
在每个部件当中,肯定会有子节点,你要么是单个子节点,要么是多个子节点。
两个子节点分别使用child、children进行描述,column或者row就是Container的子节点。
注意:在没有子节点的基础,Container这个容器会尽可能放到最大,如果有子节点,那么,它将会变得足够的小。

Alignment
控制子元素在自身容器的位置
topLeft:靠左上角
则,Container沾满所有的父级区域

ROW

在这里插入图片描述
Row默认是占了container主轴方向最最大的距离。比如是水平方向,则它在水平方向占一行的区域

主轴方向对齐方式

对齐属性
mainAxisAlignment

向第一个元素对齐(默认)
在这里插入图片描述
向最后的一个元素对齐
在这里插入图片描述
居中对齐
在这里插入图片描述
除了以上的对齐方式,还支持css3flex属性

两端对齐,左右两头靠左右
在这里插入图片描述
各个子元素的边距相等
在这里插入图片描述
两端的边距是子元素之间边距的1/2
在这里插入图片描述

垂直对齐方式

排列方位特点,是上中下
在这里插入图片描述
以中心点作为参考点
在这里插入图片描述
以顶部作为参考点
在这里插入图片描述
以底部作为参考点
在这里插入图片描述

排列顺序

一般是从左到右,可更改为从右到左
在这里插入图片描述
本来是从上到下,添加如下属性,则会变成从下到上

注意:
Row对齐属性失效原因:row没有设置为最大,如果是设置最小值,则不会有间距,没有间距,alignment可能会失效
在这里插入图片描述

Column垂直方向

使用场景:商品列表
宽度是由内容撑开,高度则撑满整个高度。
在这里插入图片描述
设置宽度为最小值
在这里插入图片描述
设置宽度占满一行
在这里插入图片描述
在这里插入图片描述
两端对齐
在这里插入图片描述
上下边距为子元素之间间距的1/2
在这里插入图片描述
所有间距都相等
在这里插入图片描述
在这里插入图片描述
以相反方向进行对齐
在这里插入图片描述
其他属性参考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

扫描二维码关注公众号,回复: 9476390 查看本文章
  • 组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方向,使用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,
})

流式布局

在这里插入图片描述
使用场景:首页导航按钮、瀑布流

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

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

使用场景:
使用row 如果宽度超过屏幕宽度,则会出现溢出错误
在这里插入图片描述
则这是,我们就会使用wrap
在这里插入图片描述
控制子元素之间的边距
spacing :控制子元素之间的距离
在这里插入图片描述
在这里插入图片描述
主轴方向从左到右边
在这里插入图片描述
在这里插入图片描述

层叠布局(绝对定位)

在这里插入图片描述
在这里插入图片描述
stack父元素
positioned子元素
在这里插入图片描述
在这里插入图片描述

相对定位

在这里插入图片描述

发布了13 篇原创文章 · 获赞 2 · 访问量 715

猜你喜欢

转载自blog.csdn.net/weixin_39553363/article/details/104489848