05、从头开始整 Flutter--基本小部件-Row&Column

本节大纲

PS:转载请注明出处
作者: TigerChain
地址: https://www.jianshu.com/p/32ac94c6218d
本文出自 TigerChain 简书 从头开始整 Flutter系列

教程简介

  • 1、阅读对象
    本篇教程适合新手阅读,老手直接略过
  • 2、教程难度
    初级,本人水平有限,文章内容难免会出现问题,如果有问题欢迎指出,谢谢

正文

一、Row & Column

1、Row 和 Column 感知

从字面意思也可以看出这是横向布局和纵向布局组件,其类似于 Android 中的 Linearlayout 的 android:orientation="horizontal" 和 android:orientation="vertical" 属性,并且 Row 和 Column 是基于 Flex 布局的

Android 原生 Flutter
LinearLayout 的android:orientation="horizontal" Row 组件
LinearLayout 的android:orientation="vertical" Column 组件

2、Row 组件

Row 组件里面是存放一系列子组件的,包括子组件的对齐方式「主轴方式和侧轴方式,基于 Flex 布局」、主轴的大小等,如果使用 Row 组件那么轴的方向就是横向的,侧轴的方向就是垂直的

Row 组件概图

3、Column 组件

和 Row 组件是一样的,只不过主轴默认的方式是纵向的,侧轴的方式是横向的

Column 组件概图

二、 Row 实例

Row 构造方法

我们说过,学习一个组件之前,先看其构造方法

Row({
    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>[], // 要摆放的组件列表
  }) 

1、mainAxisAlignment 属性

此属性是 Row 组件的内容对齐方式,有以下几种形式

  MainAxisAlignment.start, 
  MainAxisAlignment.end,
  MainAxisAlignment.center,
  MainAxisAlignment.spaceBetween,
  MainAxisAlignment.spaceAround,
  MainAxisAlignment.spaceEvenly

下面我们分别介绍

(1)、MainAxisAlignment.start 属性

此属性是 Row 组件对齐方式的默认属性,意为居左对齐,如下图所示:

MainAxisAlignment.start

显示效果

显示效果

核心代码

我们可以看到 MainAxisAlignment 只是对齐方式不同,所以我封装了一个组件,通过传递不同参数显示不同效果即可

Row 主轴对齐方式组件封装

然后如下调用即可

mainAxisAlignmentWidget(MainAxisAlignment.start, Colors.green, 'MainAxisAlignment.start 居左对齐') ,
(2)、MainAxisAlignment.center 属性

没什么说的,从字面意思也可以知道是内容成中对齐,概图如下:

MainAxisAlignment.center

显示效果

显示效果

核心代码

直接调用我们封装的组件即可

mainAxisAlignmentWidget(MainAxisAlignment.center, Colors.blue, 'MainAxisAlignment.center 居中对齐'),
(3)、MainAxisAlignment.end 属性

此属性是 Row 内容右对齐属性,概图如下所示:

MainAxisAlignment.end

显示效果

显示效果

核心代码

mainAxisAlignmentWidget(MainAxisAlignment.end, Colors.yellow, 'MainAxisAlignment.end 居右对齐'),
(4)、MainAxisAlignment.spaceBetween 属性

此属性元素之间距离相等并且两端无间距「不设置间距的情况」下,可以用做元素两端对齐等,概图如下:

MainAxisAlignment.spaceBetween

显示效果

显示效果

核心代码

mainAxisAlignmentWidget(MainAxisAlignment.spaceBetween, Colors.pink,'MainAxisAlignment.spaceBetween 两端对齐,不设置边距则两端贴着屏幕两端,且元素之间间距相等'),
(5)、MainAxisAlignment.spaceAround 属性

此属性是 Row 在主轴上对齐方式,特点是元素之间间距相等,并且两边留有间距「间距为元素之间间距的 1/2」,概图如下:

MainAxisAlignment.spaceAround

显示效果

显示效果

核心代码

mainAxisAlignmentWidget(MainAxisAlignment.spaceAround, Colors.grey, 'MainAxisAlignment.spaceAround 两端对齐,两边间距相等,并且两边间距为元素之间间距的 1/2'),
(6)、MainAxisAlignment.spaceEvenly 属性

此属性是 Row 组件在主轴方向上将空白区域均分,元素之间和两边间距都相等,概图如下:

MainAxisAlignment.spaceEvenly

显示效果

显示效果

核心代码

 mainAxisAlignmentWidget(MainAxisAlignment.spaceEvenly, Colors.deepOrange, 'MainAxisAlignment.spaceEvenly 主轴方向上空白区域均分,元素之间和两边间距都相等'),

2、textDirection 属性

mainAxisAlignment 属性描述的 Row 主轴的内容的对齐方式,而 textDirection 描述的内容的摆放顺序,是从左到右还是从右到左 textDirection 只有两个属性:

enum TextDirection {
  /// The text flows from right to left (e.g. Arabic, Hebrew).
  rtl, // 从左向右

  /// The text flows from left to right (e.g., English, French).
  ltr,// 从右向左
}

下面看看 Demo 同样,我们封装一下由于只有两个属性,封装成一个组件即可:

TextDirection 封装代码

直接看效果吧

显示效果

显示效果

核心代码

直接调用我们封装的组件即可:

//  TextDirection.ltr 从左向向排列,也是默认方式
textDirectionWidget(TextDirection.ltr,'我是文本 -> TextDirection.ltr'),
SizedBox(height: 10,), // 相当于 marginTop 为 10 
//  TextDirection.rtl 从右向左排列
textDirectionWidget(TextDirection.rtl,'我是文本 -> TextDirection.rtl'),

3、mainAxisSize 属性

mainAxisSize 在 Row 组件上指的是主轴方向上的大小,它只有两个选项,大和小即屏幕等宽和包裹内容,默认是屏幕等宽的,同样封装一个组件来通过传参来设置 mainAxisSize

mainAxisSize 组件封装

看效果吧

显示效果

显示效果

可以看到 mainAxisSize 两个属性区别

核心代码

直接调用封装好的组件即可

SizedBox(height: 10,),
mainAxisSizeSetiing(MainAxisSize.min,'--> MainAxisSize.min 属性') ,

SizedBox(height: 10,),
mainAxisSizeSetiing(MainAxisSize.max,'--> MainAxisSize.max 属性') ,

4、crossAxisAlignment 属性

Row 的侧轴方向对齐方式的属性「垂直方向」,默认是居中的,此属性和 mainAxisAlignment 属性用法基本相同,就不过多做介绍了,大概说一下,再配合效果图感受一下即可

CrossAxisAlignment.start, 子控件显示在交叉轴的起始位置。
CrossAxisAlignment.end, 子控件显示在交叉轴的末尾位置。
CrossAxisAlignment.center, 子控件显示在交叉轴的中间位置。
CrossAxisAlignment.stretch, 子控件完全填充交叉轴方向的空间。
CrossAxisAlignment.baseline, 让子控件的baseline在交叉轴方向对齐。

效果图

CrossAxisAlignment 属性效果图

PS: verticalDirection 属性会影响显示效果,此属性是决定垂直方向是从上向下还是从下向上的

5、顺带说一下 Expanded 组件

Expanded 组件一般就用在 Row/Column 或 Flex 组件中用来给空间权重「使用 flex 的值来给,默认是1」,看构造方法:

const Expanded({
    Key key,
    int flex = 1,
    @required Widget child,
  }) : super(key: key, flex: flex, fit: FlexFit.tight, child: child);

我们来实现如下效果图

横向均分并显示分隔线

试想一下用前面的 Row 的基本知识可以实现吗?先尝试一下,肯定有的人说使用 MainAxisAlignment.spaceEvenly 非常容易实现,你可以尝试一下

这里我们使用 Expanded 就非常容易实现了,首先是等分的,那么我们使用 Expanded 的 flex 都为 1,如果熟悉 Android 的朋友其实这和 LinearLayout 中的子控件的 android:layout_weight 属性是一样的,我们将每个分隔的区域封装成一个组件吧

Expanded 组件的封装

我们给了一个可选参数 flex ,不传的时候默认就是 1 ,我们调用一下看看效果,并且有无分隔线是通过参数传过来的

Row 水平均分并带分隔线

效果就是我们开头看到的效果

横向均分并显示分隔线

我们再传递 flex 参数

传递 flex 参数

再看看效果

传递 flex 参数显示效果

可以看到权重按 1 2 3 去分隔了,注意 flex 是个整数不要传小数即可「下去自己可以慢慢玩」

三、Column 实例

说完了 Row 组件感觉 Column 没什么说的,和 Row 组件属性一毛一样,只不过主轴是纵向的「垂直的」,侧轴是横向的,其实上面我们封装 Row 主轴方向上对齐方式的时候使用了 Column ,并且在 Text&Image 中也大量使用了 Column 组件

我们来看看 Column 的 crossAxisAlignment「侧轴的对齐方式,也就是横向对齐方式」 属性

crossAxisAlignment 属性

crossAxisAlignment 是 Column 侧轴的对齐方式也就是水平对齐方式,默认是居中的「前提在背景宽度的基础上居中,废话居中肯定要有参照物」

显示效果

显示效果

核心代码

Column 水平居中属性代码

2、其它属性

看看构造方法

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>[],
  }) : super(
    children: children,
    key: key,
    direction: Axis.vertical,
    mainAxisAlignment: mainAxisAlignment,
    mainAxisSize: mainAxisSize,
    crossAxisAlignment: crossAxisAlignment,
    textDirection: textDirection,
    verticalDirection: verticalDirection,
    textBaseline: textBaseline,
  );
}

从属性 direction: Axis.vertical 可以看到默认的方式就是垂直的,主要属性是

  • mainAxisAlignment 主轴「纵向」的对齐方式
  • mainAxisSize 主轴「纵向」的大小,有包裹和尽量大
  • textDirection 文本对齐方式
  • verticalDirection 垂直方向方向
  • textBaseline 基线
  • children 要摆放的组件们

其实 Column 组件真的没有什么好说的,把 Row 组件掌握了以后,Column 无非就是把 Row 换成纵向排列而已,就不一一写这些属性了,大家下去实操一下就好

四、总结

本节主要说了 Flutter 两个布局类组件 Row 和 Column 是必须掌握的组件,我们来大概总结一下

Row 组件

  • 水平方向上布局子组件的,默认主轴是等屏幕宽,有多种对齐方式
  • 侧轴的方向「垂直方向」对齐方式默认是居中的
  • textDirection 描述主轴的孩子组件摆放顺序
  • 搭配 Expanded 来完成一些拆分效果

Column 组件

  • 垂直方向上布局子组件的,默认主轴是等屏高度「如果不设置限制调试的话」,有多种对齐方式
  • 侧轴的方向「水平方向」对齐方式默认是居中的
  • textDirection 描述主轴的孩子组件摆放顺序
  • 同样也可以搭配 Expanded 来完成一些拆分效果

好了本节就到此结束了,下去多写一下就了解了,想玩那个属性直接看其构造方法即可


作者: TigerChain 订阅查看更多内容,公号「TigerChain」同步
本文出自 TigerChain从头开始整 Flutter

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357