Flutter 必备:Flex 布局完全解读

本文字数: 4894

预计阅读时间: 30分钟

作者介绍

本期特邀作者:张风捷特烈

掘金社区优秀作者,技术领域主要以Android为中心,兼顾涉猎全栈以及多语言。目前正全力研究flutter框架;热爱技术分享,常在掘金社区分享原创文章。

Flutter作为一个跨平台的框架,最能展现它实力的当属界面了,一套界面可以同时运用在多个终端,这是一件非常令人兴奋的事。进入Flutter的世界,你的第一道拦路虎当属布局了,庞大的组件家族让你望而却步,但将他们进行梳理之后你就会发现,这是非常友善的。你可以在需要的时候使用相应的单体组件,需要排布的时候也会有众多的布局组件为你做后盾。

Flutter中的Flex布局作为五虎上将之一,当然虎父无犬子,其子Row和Column也能力非凡,使用时你有没有被mainAxisAlignment、crossAxisAlignment弄得晕头转向?本文将助你把他们纳入麾下,成为你布局战场上的猛将而非敌人。

我们先看一下父子三人在Flutter布局体系中的位置: 多子组件布局

01

看一下Flex家族在源码中的位置

Flex家族包括Flex组件、Row组件、Column组件,位于widgets包中的basic文件中。

 1---->[flutter/lib/src/widgets/basic.dart:3677]----
 2class Flex extends MultiChildRenderObjectWidget {
 3    Flex({
 4        Key key,
 5        @required this.direction,
 6        this.mainAxisAlignment = MainAxisAlignment.start,
 7        this.mainAxisSize = MainAxisSize.max,
 8        this.crossAxisAlignment = CrossAxisAlignment.center,
 9        this.textDirection,
10        this.verticalDirection = VerticalDirection.down,
11        this.textBaseline,
12        List children = const [],
13      }) : assert(direction != null),
14
15---->[flutter/lib/src/widgets/basic.dart:4015]----
16class Row extends Flex {
17
18---->[flutter/lib/src/widgets/basic.dart:4213]----
19class Column extends Flex {

02

Flex的属性一览

03

轴向: direction:Axis

1enum Axis {
2  horizontal,//水平
3  vertical,//竖直
4}

也就是水平排放还是竖直排放,可以看出默认情况下都是主轴顶头,交叉轴居中,比如horizontal下,主轴为水平轴,交叉轴则为竖直,也就是水平顶头,竖直居中。这里使用MultiShower快速展示,更好地对比出不同之处,MultiShower详见(https://juejin.im/post/5d2842ac6fb9a07eb15d82ad)。

 1var direction =[Axis.horizontal,Axis.vertical];
 2var show = MultiShower(direction,(e){
 3  return Flex(
 4    direction: e,
 5    children: [redBox,blueBox,yellowBox,greenBox],
 6
 7  );
 8},color: Colors.black12,width: 300,height: 200);
 9
10var redBox= Container(
11  color: Colors.red,
12  height: 50,
13  width: 50,
14);
15
16var blueBox= Container(
17  color: Colors.blue,
18  height: 30,
19  width: 60,
20);
21
22var yellowBox= Container(
23  color: Colors.yellow,
24  height: 50,
25  width: 100,
26);
27
28var greenBox= Container(
29  color: Colors.green,
30  height: 60,
31  width: 60,
32);

04

主轴方向:

mainAxisAlignment:MainAxisAlignment

主轴方向的排布规则,这里以水平为例,主轴为水平方向;竖直类比即可。

1enum MainAxisAlignment {
2  start,//顶头
3  end,//接尾
4  center,//居中
5  spaceBetween,//顶头接尾,其他均分
6  spaceAround,//中间的孩子均分,两头的孩子空一半
7  spaceEvenly,//均匀平分