Flutter 布局样式

作者: iwakevin | 来源:发表于2018-12-05 15:21 被阅读143次

    在 Flutter 里布局需要使用特定的布局组件,其核心的组件包括了:Align、Stack、Row、Center、Column、Flex、Flexible、Expanded 等。

    Row 与 Column

    Row 与 Column是一个用于行列的布局组件。被装载在 children 里的组件排列方式都会变成行或列排列方式。Row/Column 是从 Flex 布局衍生过来的,所以会看得很多 Flex 布局的影子。

    var body = new Center(
        child: new Column(                  // 列布局
            children: <Widget>[
                new Row(
                    children: <Widget>[
                        new Container(
                            color: Colors.yellow,
                            width: 100.0,
                            height: 100.0,
                        ),
                        new Container(
                            color: Colors.red,
                            width: 100.0,
                            height: 100.0,
                        ),
                    ]
                ),
                new Container(
                    color: Colors.blue,
                    width: 100.0,
                    height: 100.0,
                ),
                new Container(
                    color: Colors.green,
                    width: 100.0,
                    height: 100.0,
                ),
            ],
        ),
    );
    
    image.png

    Row/Column 常用的属性:

    • children → List - 子组件列表
    • mainAxisAlignment → MainAxisAlignment - 主轴对齐方式。
    • crossAxisAlignment → CrossAxisAlignment - 侧轴对齐方式。
    • mainAxisSize → MainAxisSize - 本类的主轴大小。
    • textBaseline → TextBaseline - 基线对齐方式。
    • textDirection → TextDirection - 水平方向上的组件顺序。
    • verticalDirection → VerticalDirection - 垂直方式上的子组件顺序。
      Row 有以下特点(Column 也一样):
    • 它的最大高度是子组件的最大高度。
    • Row 的宽度由 mainAxisSize 属性确定。如果 mainAxisSize 属性是 MainAxisSize.max,则 - - Row 的宽度是传入约束的最大宽度。
      根据 mainAxisAlignment(主轴)和 crossAxisAlignment(侧轴)确定每个子组件的位置。
      添加 mainAxisSize: MainAxisSize.min 后。
    child: new Row(
        mainAxisSize: MainAxisSize.min,
        // ...
    )
    

    当设置 mainAxisAlignment: MainAxisAlignment.spaceBetween 的时候。

    child: new Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        // ...
    )
    

    Flex

    对前端开发比较深入的都知道有 Flexbox 布局。在 Flutter 里提供了 Flex 布局组件。它是 Column 和 Row 的结合体,为什么这么说?因为 Flex 只需要设置一下主轴方向就可以变成 Row/Column。

    // 等效于 Column
    new Flex(
        direction: Axis.vertical,
        children: <Widget>[],
    )
    
    // 等效于 Row
    new Flex(
        direction: Axis.horizontal,
        children: <Widget>[],
    )
    

    其他,使用方式与 Row/Column 无异。

    Flexible

    Flexible 与 Flex 类似。

    new Flexible(
        flex: 1,
        fit: FlexFit.loose,
        child: new Text('aaa'),
    ),
    

    Expanded

    Expanded 与 Flex 类似,但是它会尽可能的扩大,相等于 flex: 1 一样。

    new Expanded(
        flex: 1,
        child: new Text('aaa'),
    ),
    

    Center

    Center 是用于居中对齐的布局。它的尺寸受子组件以及 widthFactor 和 heightFactor 限制。如果 widthFactor 和 heightFactor 为空着,则 Center 会尽可能大,如果 widthFactor 是 2.0,那么这个小部件的宽度将总是其子宽度的两倍。

    child: new Center(
        child: new Column(
            children: <Widget>[
                new Text('Hello'),
            ],
        ),
    ),
    

    Align

    Align 是一个对齐布局组件,用于将其子项与其自身对齐,并根据子级的大小自行调整大小。

    Padding

    Padding 是一个带有内边距的布局组件。

    new Padding(
        padding: new EdgeInsets.all(8.0),
        child: const Card(child: const Text('Hello World!')),
    )
    

    Stack

    Stack 是一个运允许子组件重叠的布局,类似绝对定位一样。

    new Stack(
        alignment: new Alignment(0.6, 0.6),
        children: <Widget>[
            new Text('a'),
            new Text('b'),
            new Text('c'),
        ]
    ),
    

    第一个子组件的层次是最低的,之后的逐渐增大,也就是像栈结构一样。

    Transform

    Transform 是一个动画过渡布局组件。

    相关文章

      网友评论

        本文标题:Flutter 布局样式

        本文链接:https://www.haomeiwen.com/subject/eyqwcqtx.html