flutter控件練習demo地址:githubandroid
由於 Row 和 Column 都是繼承於 Flex,因此他們兩個的屬性也都是 Flex 的屬性git
對於 Row 來講 , 水平是主軸。垂直是 交叉軸。 對於 Column 來講, 垂直是主軸。水平是 交叉軸 把 children 放到 主軸 的哪一個位置 。 若是要驗證這個屬性,記住把 mainAxisSize 設置成 MainAxisSize.max ,github
取值 | 說明 | 樣式圖片(Rowd 的demo) |
---|---|---|
MainAxisAlignment.start(默認值) | 把 children 放到主軸的頭部 | ![]() |
MainAxisAlignment.center | 把 children 放到主軸的中間 | ![]() |
MainAxisAlignment.end | 把 children 放到主軸的尾部 | ![]() |
MainAxisAlignment.spaceAround | 將主軸方向空白區域均分,使得children之間空間相等,可是首尾 childre 的空白部分爲一半 | ![]() |
MainAxisAlignment.spaceBetween | 將主軸方向空白區域均分,使得children之間空間相等,可是首尾childre靠近收尾,沒有空細逢 | ![]() |
MainAxisAlignment.spaceEvenly | 將主軸方向空白區域均分,使得children之間空間相等,包括首尾childre | ![]() |
也就是來規定本身( Row 或者 Column )的大小。bash
交叉軸 顧名思義: 就是 跟 主軸 垂直的 一個軸 對於 Row 。交叉軸 是 在垂直。對於 Column,交叉軸 是水平 。下面仍是 以 Row 舉個例子app
取值 | 說明 | 圖片demo(Row) |
---|---|---|
CrossAxisAlignment.start | 把 children 放到交叉軸的頭部 | ![]() |
CrossAxisAlignment.end | 把 children 放到交叉軸的尾部 | ![]() |
CrossAxisAlignment.center | 把 children 放到交叉軸的中間 | ![]() |
CrossAxisAlignment.stretch | 讓children填滿交叉軸方向 | 無(沒有測試出來,控件 找不到了) |
CrossAxisAlignment.baseline | 讓children 於 baseline 對齊,若是主軸是垂直的,那麼這個值是看成開始 ,設置了此 屬性 textBaseline 不能爲 null | ![]() |
children 在 主軸 怎樣排列。 正方向排列仍是反方向排列less
children 在 交叉軸 怎樣排列。 正方向排列仍是反方向排列ide
取代線性佈局 (和Android中的LinearLayout類似,可是我感受怎麼這麼像 FrameLayout 呢?),Stack容許子 widget 堆疊, 你可使用 Positioned 來定位他們相對於Stack的上下左右四條邊的位置。Stacks是基於Web開發中的絕度定位(absolute positioning )佈局模型設計的。用於將多個childs相對於其框的邊緣定位,多用於以簡單方式重疊children佈局
import 'package:flutter/material.dart';
class LayoutDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text("row"),
centerTitle: true,
),
body: RowDemo(),
);
}
}
class RowDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
final _list = <Widget>[
RaisedButton(
disabledColor: Colors.red,
child: Text("兒子1"),
),
Text("兒子2"),
Text("兒子3"),
Text("兒子4"),
Text("兒子5"),
];
return Column(
children: <Widget>[
SizedBox(
height: 30,
),
Container(
color: Colors.grey,
child: Row(
// 主軸(main axis)
// 把 children 放到 Column 主軸 的哪一個位置
// end : 尾部, start :頭部, center : 中間 ,spaceBetween:在 children 之間均勻地放置 空間 ,spaceAround : 每一個 children
mainAxisAlignment: MainAxisAlignment.start,
// 此 Row 的寬度。默認是 MainAxisSize.max
// MainAxisSize.min 是 包裹 children 的高度 便可 。android 中 至關於 wrap_content
// MainAxisSize.max 是 鋪滿 Row 的父 Widget 的寬度 。android 中 至關於 match_parent
// 若是設置成 MainAxisSize.min 。 那麼 mainAxisAlignment 屬性至關於無效。 由於是包裹 children
mainAxisSize: MainAxisSize.max,
// 交叉軸(cross axis)
// 把 children 放到 Column 主軸 的哪一個位置
// end : 尾部, start :頭部, center : 中間 ,
crossAxisAlignment: CrossAxisAlignment.start,
// children 在主軸 的排列順序
textDirection: TextDirection.ltr,
// children 在 交叉軸 的排列順序
verticalDirection: VerticalDirection.down,
children: _list,
),
),
SizedBox(
height: 30,
),
SizedBox(
width: 200,
height: 200,
child: Stack(
alignment: AlignmentDirectional.topStart,
// alignment: AlignmentDirectional(-1.0, -1.0),
fit: StackFit.loose,
overflow: Overflow.visible,
children: <Widget>[
Container(
color: Colors.black,
height: 200,
width: 200,
),
Container(
color: Colors.deepPurple,
height: 100,
width: 100,
),
Container(
color: Colors.green,
height: 50,
width: 50,
),
],
)),
],
);
}
}
複製代碼