一、簡介緩存
二、構造函數markdown
Row({ Key key, MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, MainAxisSize mainAxisSize = MainAxisSize.max, CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, TextDirection textDirection, VerticalDirection verticalDirection = VerticalDirection.down, TextBaseline textBaseline, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子ide
三個容器橫向排放函數
Widget _buildColumn() { return Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, textDirection: TextDirection.ltr, textBaseline: TextBaseline.alphabetic, mainAxisSize: MainAxisSize.max, verticalDirection: VerticalDirection.down, children: <Widget>[ Container( height: 50, width: 50, color: Colors.blueAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( height: 50, width: 50, color: Colors.greenAccent, ) ], ); } 複製代碼
一、簡介oop
二、構造函數佈局
Column({ Key key, MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, MainAxisSize mainAxisSize = MainAxisSize.max, CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, TextDirection textDirection, VerticalDirection verticalDirection = VerticalDirection.down, TextBaseline textBaseline, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子ui
三個容器豎向排放,因爲設置了up的擺放方式,致使位置是倒過來的this
Widget _buildColumn() { return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, verticalDirection: VerticalDirection.up, textBaseline: TextBaseline.alphabetic, textDirection: TextDirection.ltr, children: <Widget>[Container( height: 50, width: 50, color: Colors.blueAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( height: 50, width: 50, color: Colors.greenAccent, )], ); } 複製代碼
一、簡介spa
二、構造函數.net
Stack({ Key key, this.alignment = AlignmentDirectional.topStart, this.textDirection, this.fit = StackFit.loose, this.overflow = Overflow.clip, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
將兩個容器疊加在一塊兒,而且在對齊右下角
Widget _buildColumn() { return Stack( textDirection: TextDirection.ltr, alignment: Alignment.bottomRight, overflow: Overflow.visible, fit: StackFit.loose, children: <Widget>[ Container( width: 100, height: 100, color: Colors.greenAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ) ], ); } 複製代碼
一、簡介
二、構造函數
IndexedStack({ Key key, AlignmentGeometry alignment = AlignmentDirectional.topStart, TextDirection textDirection, StackFit sizing = StackFit.loose, this.index = 0, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
經過index控制第二個容器的出現,第一個容器則隱藏
Widget _buildColumn() { return IndexedStack( index: 1, sizing: StackFit.loose, textDirection: TextDirection.ltr, alignment: Alignment.bottomRight, children: <Widget>[ Container( width: 100, height: 100, color: Colors.greenAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ) ], ); } 複製代碼
一、簡介
二、構造函數
Flow({ Key key, @required this.delegate, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
在Flow佈局中擺放一堆容器,而且大小不一
Widget _buildColumn() { return Flow( delegate: GridFlowDelegate(margin: EdgeInsets.all(10.0)), children: <Widget>[ Container( width: 100, height: 100, color: Colors.greenAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( width: 100, height: 100, color: Colors.greenAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( width: 100, height: 100, color: Colors.greenAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( width: 100, height: 100, color: Colors.greenAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( width: 100, height: 100, color: Colors.greenAccent, ) ], ); } 複製代碼
在佈局管理器中,自定義咱們的擺佈方式,以一行中最高的容器做爲換行的高度進行橫向擺佈
class GridFlowDelegate extends FlowDelegate { EdgeInsets margin = EdgeInsets.zero; GridFlowDelegate({this.margin}); @override void paintChildren(FlowPaintingContext context) { var x = margin.left; //繪製子控件的x座標 var y = margin.top; //繪製子控件的y座標 var maxHeightIndex = 0; //同一行中最大高度的子控件的索引,用於換行 for (int i = 0; i < context.childCount; i++) { // 當前控件須要的最大寬度 = 控件自己的寬度 + 左右邊距 var w = context.getChildSize(i).width + x + margin.right; if (w < context.size.width) { // 若是未超出當前未分配的寬度,則直接平移到對應位置畫出來 context.paintChild(i, transform: Matrix4.translationValues(x, y, 0.0)); // 下一次的x座標 x = w + margin.left; // 在第二個控件開始取同一行的最大高度的控件 if (i >= 1){ var currentHeight = context.getChildSize(i).height + margin.top + margin.bottom; var lastHeight = context.getChildSize(maxHeightIndex).height + margin.top + margin.bottom; if (currentHeight > lastHeight) { // 保留最大高度的索引值 maxHeightIndex = i; } } }else{ // 若是超出當前未分配的寬度,則先歸位x座標恢復默認值,從左邊開始從新分配空間 x = margin.left; // y座標 y += context.getChildSize(maxHeightIndex).height + margin.top + margin.bottom; // 找到座標後直接平移到對應位置畫出來 context.paintChild(i, transform: Matrix4.translationValues(x, y, 0.0)); // 下一次的x座標須要將它加上本身的寬度,和本身的左右邊距 x += context.getChildSize(i).width + margin.left + margin.right; } } } @override bool shouldRepaint(FlowDelegate oldDelegate) { return oldDelegate != this; } } 複製代碼
一、簡介
二、構造函數
Table({ Key key, this.children = const <TableRow>[], this.columnWidths, this.defaultColumnWidth = const FlexColumnWidth(1.0), this.textDirection, this.border, this.defaultVerticalAlignment = TableCellVerticalAlignment.top, this.textBaseline, }) 複製代碼
三、例子
將文字居底對齊的表格
Widget _buildColumn() { return Table( textDirection: TextDirection.ltr, textBaseline: TextBaseline.alphabetic, defaultColumnWidth: FixedColumnWidth(80.0), defaultVerticalAlignment: TableCellVerticalAlignment.bottom, border: TableBorder.all(color: Colors.blueGrey, style: BorderStyle.solid), columnWidths: { 0: FixedColumnWidth(50.0), 1: FixedColumnWidth(100.0), 2: FixedColumnWidth(100.0), }, children: <TableRow>[ TableRow(children: [ Text("序號"), Text("名字"), Text("成績"), ]), TableRow(children: [ Text("1"), Text("張三"), Text("80"), ]), TableRow(children: [ Text("2"), Text("李四"), Text("88"), ]), TableRow(children: [ Text("3"), Text("王五"), Text("92"), ]) ]); } 複製代碼
一、簡介
二、構造函數
Wrap({ Key key, this.direction = Axis.horizontal, this.alignment = WrapAlignment.start, this.spacing = 0.0, this.runAlignment = WrapAlignment.start, this.runSpacing = 0.0, this.crossAxisAlignment = WrapCrossAlignment.start, this.textDirection, this.verticalDirection = VerticalDirection.down, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
經過Wrap控件建立出豎向的流式佈局
Widget _buildColumn() { return Wrap( textDirection: TextDirection.ltr, alignment: WrapAlignment.center, verticalDirection: VerticalDirection.down, crossAxisAlignment: WrapCrossAlignment.center, direction: Axis.horizontal, runAlignment: WrapAlignment.center, runSpacing: 10.0, spacing: 10.0, children: <Widget>[ Chip( label: Text("張三張三張三"), ), Chip( label: Text("李四李四李四"), ), Chip( label: Text("王五王五王五"), ), Chip( label: Text("趙六趙六趙六"), ), Chip( label: Text("錢七"), ), Chip( label: Text("孫八"), ), ], ); } 複製代碼
一、簡介
二、構造函數
ListBody({ Key key, this.mainAxis = Axis.vertical, this.reverse = false, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
顯示3個不一樣顏色的容器,因爲其父容器是Flex
,會致使ListBody
的側軸被拉昇到最大
Widget _buildColumn() { return Flex( direction: Axis.vertical, children: <Widget>[ ListBody( mainAxis: Axis.vertical, reverse: false, children: <Widget>[ Container( height: 50, width: 50, color: Colors.blueAccent, ), Container( height: 50, width: 50, color: Colors.redAccent, ), Container( height: 50, width: 50, color: Colors.greenAccent, ) ], ), ], ); } 複製代碼
一、簡介
二、構造函數
ListView({ Key key, Axis scrollDirection = Axis.vertical, bool reverse = false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap = false, EdgeInsetsGeometry padding, this.itemExtent, bool addAutomaticKeepAlives = true, bool addRepaintBoundaries = true, double cacheExtent, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
建立三個具備回彈功能的列表控件
Widget _buildColumn() { return ListView( physics: BouncingScrollPhysics(), cacheExtent: 10.0, primary: true, padding: EdgeInsets.all(15.0), reverse: false, scrollDirection: Axis.vertical, children: <Widget>[ Container( height: 300, width: 300, color: Colors.blueAccent, ), Container( height: 300, width: 300, color: Colors.redAccent, ), Container( height: 300, width: 300, color: Colors.greenAccent, ) ], ); } 複製代碼
一、簡介
二、構造函數
CustomMultiChildLayout({ Key key, @required this.delegate, List<Widget> children = const <Widget>[], }) 複製代碼
三、例子
首先建立控件的代理類,包括控件的大小和控件的位置,經過id獲取傳遞過來的子控件,將description
的控件放置在title
下方
class IdLayoutDelegate extends MultiChildLayoutDelegate { IdLayoutDelegate(); @override void performLayout(Size size) { BoxConstraints constraints = BoxConstraints(maxWidth: size.width); // 經過id獲取對應的控件大小 Size titleSize = layoutChild("title", constraints); Size descriptionSize = layoutChild("description", constraints); // 擺放id的控件位置 positionChild("title", Offset(0.0, 0.0)); positionChild("description", Offset(0.0, titleSize.height)); } @override bool shouldRelayout(MultiChildLayoutDelegate oldDelegate) { return oldDelegate != null; } } 複製代碼
經過id將對應的控件擺佈在對應的位置
Widget _buildColumn() { return CustomMultiChildLayout( delegate: IdLayoutDelegate(), children: <Widget>[ LayoutId( id: "title", child: Text("Hensen"), ), LayoutId( id: "description", child: Text("Flutter工程師"), ) ], ); } 複製代碼
一、簡介
二、構造函數
const LayoutBuilder({ Key key, LayoutWidgetBuilder builder, }) 複製代碼
三、例子
經過判斷父控件的尺寸大小,若是是大尺寸,就用大圖標,若是是小尺寸,就用小圖標
Widget _buildColumn() { return LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { if (constraints.maxWidth > 200.0) { // 尺寸大的 return FlutterLogo(size: 200); } // 尺寸小的 return FlutterLogo(size: 50); }, ); } 複製代碼
![]() Hensen_ |