[Flutter] Layout 思維

這一類的 UI Framework 最需要掌握的是 UI Component (Widget) 的操作,尤其是排版的部分,要如何生出自己想要的畫面,就決定於排版技巧的熟悉度,就像網頁切版,如果 CSS 不熟,就無法切出漂亮有可用的版型,同理,Flutter 也需要先從 Layout Widget 跟設計思維學起

Layout 思維

Flutter 有提供很多種用來排版的 Widget,但要使用哪一種會比較合適,這既需要對每一個 Layout Widget 的特性做深入的了解,但這之前,總要知道如何安排畫面,才能選到對的 Widget。這裡有一個官網文件提供的圖

1570243349615

這是一個算常見的產品介紹畫面,當看到這畫面時,會思考要怎麼呈現。根據圖上面所標示的,可以知道第一層是使用 Row 來呈顯左右兩欄的畫面,而第一欄使用 Column Widget 來顯示其他資訊,而第二欄是使用 Image Widget 來顯示畫面。

再來第一欄的產品資訊使用 Column Widget ,所以物件會是由上而下的呈現,細節設計思維的部分可以參閱下圖

1570243368663

所以綜合這些資訊,我們可以理解成 Flutter 的畫面是從左上到右下,由上而下,由左而右採 S 型移動。這樣理解後,就可以幫我們選擇合適的 layout widget 了

Layout Widget 屬性

Aligning Widgets

RowColumn widget 內有可以設定排序物件的屬性,mainAxisAligment 和 ``crossAxisAlignment`

1570243387835

mainAxisAlignment 有提供下列的選項可以使用

  • start (預設值)

    1570249691644

  • center

    1570248054188

  • end

    1570248078641

  • spaceAround: 頭尾的空白大小是中間空白的一半

    1570248128083

  • spaceBetween

    1570248154754

  • spaceEvenly

    1570248184243

crossAxisAlignment 有提供以下的選項可使用

  • center(預設值)

    1570248054188

  • baseline: 須設定 textBaseline 屬性

    1570249395817

  • 沒設定 baseline 時

    1570249591807

  • end

    1570248907202

  • start

    1570248936450

  • stretch: 塞滿畫面

Sizing

使用 Expanded widget 可以避免原始圖檔太大造成 App 產生畫面時的錯誤

  • 使用前

    1570249918702

  • 使用後

    1570249929541

設定 flex 的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Image.network('https://picsum.photos/300'),
),
Expanded(
flex: 2,
child: Image.network('https://picsum.photos/800'),
),
Expanded(
flex: 3,
child: Image.network('https://picsum.photos/600'),
)
],
);

1570250111924

小結

很多排法跟 css flex 很像,在觀念銜接上是很快速的。基本上沒什麼大問題,下一篇筆記會針對 layout widget 做研究