Flutter体验 Day 12-线性布局

线性布局

不管是水平布局或是垂直布局都是布局上常用的配置方式。

布局组件

  • Row
  • Column
  • Wrap

Layout

Flutter 目标是提供跨平台的开发体验,因此需要提供弹性的方式来处理呈现平台上布局的行为。在官网上提供了许多的组件,依照特性可以分为这三个种类:

  • Single-child layout

这个布局类别的组件通常具有一个 child 的属性,例如ContainerSizeBox…。

  • Multi-child layout

这个布局类别的组件通常具有一个 children 的属性,例如RowColumn…。

  • Sliver

这个布局类别的组件只能是 Sliver 类别,例如SliverListSliverGridSliverAppBar…。

Row、Column

线性布局是很常见的排列方式,Row 是以水平的方向进行排列,Column是以垂直的方向进行排列。

row_column

RowColumn 的使用方式相类似,只差在排列的方向不一样,都是属於 Multi-child layout 类别的一员,在排列行为又可切分成主轴设定与纵轴设定两种,我们直接看下面的范例看看差异性在哪边:

 var theRow = Container(
      margin: const EdgeInsets.all(5.0),
      padding: const EdgeInsets.all(3.0),
      decoration: BoxDecoration(border: Border.all(color: Colors.blueAccent)),
      // 可以更换 Colume 为 Row,理解主轴和纵轴设定差别
      child: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Text("ABC"),
          Text(
            "DEF",
            style: TextStyle(
              fontSize: 40.0,
            ),
          ),
          Text("GHI")
        ],
      ),
    );

widget_row

    var theColumn = Container(
      margin: const EdgeInsets.all(5.0),
      padding: const EdgeInsets.all(3.0),
      decoration: BoxDecoration(border: Border.all(color: Colors.blueAccent)),
      // 可以更换 Colume 为 Row,理解主轴和纵轴设定差别
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          Text("ABC"),
          Text(
            "DEF",
            style: TextStyle(
              fontSize: 40.0,
            ),
          ),
          Text("GHI")
        ],
      ),
    );

widget_column

Wrap

Row 或是 Column 使用上,若 children 的元素内容大小超过可显示的范围时,会出现类似下面这种提示画面。

widget_row_overflow

我们可以使用Wrap来提供 children 里的元素在无法预期内容大小时提供一个弹性排列的方法。在渲染过程会按顺列放到画面上并计算是否会有溢出的状况,若超过则会将该元件放到下一行。spacing用来定义两个元素的距离,runSpacing用来定义上下两排的距离,alignment 则是可以定义每一列的配置方式。

    var theWrap = Wrap(
      spacing: 30.0,
      runSpacing: 15.0,
      alignment: WrapAlignment.center,
      children: <Widget>[
        Text("ABCDEFGHIJKLKNPQRSTUVWXYZ" * 1),
        Text("0123456789"),
        Text("零一二三四五六七八九" * 5), // 溢出
        Text("0123456789"),
      ],
    );

wrap

小结

练习成果


<<:  Day 05 : 来点不一样的 Two Sum

>>:  D20 - 如何用 Apps Script 自动化地创造与客制 Google Slides?(一)架构拆解与更改文字

OXYGEN Builder+CLOUDWAYS的见解,网站测速跑分已不再重要

我很肤浅,又爱慕虚荣,曾经一心追求网页载入速度 所幸,运气向来不错,总是能殊途同归压对宝? 虽然说,...

图的走访 - BFS 篇

4 图的走访 - BFS 篇 如果要好好地探索一张图,最经典的方法莫过於深度优先搜索(Depth F...

Alpine Linux Porting (一点十?)

为了更理解Alpine initramfs的眉角,今天持续来看一下Alpine的mkinitfs套件...

NetSuite Order to Cash flow - Fulfill Sales Order

Recap 前天提到, 建立一顶订单销售的流程大致可以分为 Customer enter Sales...

每个人都该学的30个Python技巧|技巧 22:想怎麽设就怎麽设的自订函式(字幕、衬乐、练习)

在这个系列我们教过很多种函式嘛,但那些都是Python内建的,今天就要来教你怎麽自订函式。首先先带你...