线性布局
线性布局类似Android原生中的LinearLayout。 row和column布局都有两根轴,主轴和交叉轴。 Row实现水平方向布局,主轴是水平轴,交叉轴是垂直轴 Column正好相反。
通过Expanded组件和其中的flex属性,可以控制平均分配Row或Column的空间
水平布局Row
垂直布局Column
非线性布局
Stack帧布局
类似Android中的FrameLayout
Flex弹性布局
和CSS中的Flex布局类似
body: Flex(
direction: Axis.vertical,
children: [
],
),
其中direction为必选参数,指定children中元素的排列方向 其实Row和Column都是继承自Flex,不过固定了direction的方向,而Flex则更加灵活。
流式布局Wrap
使用线性布局时,超出屏幕的部分会报溢出错误,但是流式布局会把超出的部分自动换行
混合布局
单组件布局
Container只能放一个子节点,是Flutter中的盒子模型 虽然它只能放置一个元素,但是它有一个核心属性decoration
,我们经常用它来给制定的部件设置装饰,例如内外边距,圆角等等
Container({
super.key,
this.alignment,
this.padding,//内边距
this.color,//颜色
this.decoration,//装饰
this.foregroundDecoration,
double? width,
double? height,
BoxConstraints? constraints,
this.margin,
this.transform,
this.transformAlignment,
this.child,
this.clipBehavior = Clip.none,
})
可以结合行或列布局实现更复杂的效果 EdgeInsets可以用来指定内边距
内外边距
使用Container组件可以实现将一组控件包裹,控制控件的内外边距
//使用Container包裹控件
Container(
padding: const EdgeInsets.all(30),
margin: const EdgeInsets.all(20),
child:Text('content')
)
Container常用来设置内外边距、圆角等,例如如下设置。
Container(
height: 300,
padding: const EdgeInsets.all(20),
margin: const EdgeInsets.symmetric(vertical: 30, horizontal: 30),
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10)),
color: Color.fromRGBO(25, 25, 25, 0.1),
),
child: Column(···)
)
常见的decoration
有BoxDecoration
SizeBox
SizeBox的定义十分简单,可以看到他就只有三个属性。比较常用的场景就是用来设置部件之间的间距。
const SizedBox({ super.key, this.width, this.height, super.child });
例如一个Image部件和Text部件间希望间隔10dp的间距,那么可以这么设置
Row(
children: [
Image.asset("assets/images/2.0x/app_icon.png",width: 40, height: 40),
SizedBox(width: 10),
Text("作者", style: TextStyle(fontSize: 16, color: Colors.black)),
],
),
Padding
当然除了使用SizeBox来设置部件间的间距,还有一个更纯粹的部件,Padding。它有以恶padding属性,可以更精细化的制定上下左右的间距
const Padding({
super.key,
required this.padding,
super.child,
});
Row(
children: [
Image.asset("assets/images/2.0x/app_icon.png",
width: 40, height: 40),
Padding(padding: EdgeInsets.only(left: 10),
child: Text("作者", style: TextStyle(fontSize: 16, color: Colors.black)),),
],
),
ClipRRect
如果我们想给某个部件设置圆角,使用ClipRRect也可以实现,可以看到它有一个borderRadius属性,利用它来设置圆角,然后将我们的部件设置到child属性中即可
const ClipRRect({
super.key,
this.borderRadius = BorderRadius.zero,
this.clipper,
this.clipBehavior = Clip.antiAlias,
super.child,
});
例如设置圆角图片就可以使用这种方法
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: Image.asset("assets/images/2.0x/app_icon.png",
width: 40, height: 40),
),