本篇文章已授权微信公众号 YYGeeker
独家发布转载请标明出处
1、简介
2、构造函数
Container({
Key key,
this.alignment,
this.padding,
Color color,
Decoration decoration,
this.foregroundDecoration,
double width,
double height,
BoxConstraints constraints,
this.margin,
this.transform,
this.child,
})
3、例子
decoration可以实现阴影和边框的效果
Widget _buildColumn() {
return Container(
constraints: BoxConstraints.expand(
height: 200,
),
padding: EdgeInsets.all(8.0),
child: Text("Hello World"),
alignment: Alignment.center,
transform: Matrix4.identity(),
margin: EdgeInsets.all(16.0),
decoration: BoxDecoration(
border: Border.all(color: Colors.black, width: 2.0),
color: Colors.blue[200],
borderRadius: BorderRadius.circular(20.0)
),
foregroundDecoration: BoxDecoration(),
height: 200,
width: 100,
//color: Colors.blue[200],
);
}
1、简介
2、构造函数
const Padding({
Key key,
@required this.padding,
Widget child,
})
3、例子
Widget _buildColumn() {
return Padding(
padding: EdgeInsets.all(8.0),
child: Container(
height: 200,
width: 200,
color: Colors.blue[200],
),
);
}
1、简介
2、构造函数
const Align({
Key key,
this.alignment: Alignment.center,
this.widthFactor,
this.heightFactor,
Widget child
})
3、例子
由于设置了heightFactor和widthFactor,表示父控件的宽高最大应该是子控件的2.0倍。如果不设置heightFactor和widthFactor,则父控件则无限大,则子控件会在屏幕底部中点
Widget _buildColumn() {
return Container(
color: Colors.blue[200],
child: Align(
heightFactor: 2.0,
widthFactor: 2.0,
alignment: Alignment(0.0, 1.0), //底部中点对齐
child: Text("Hello!"),
),
);
}
1、简介
alignment
属性设置为居中2、构造函数
class Center extends Align {
const Center({ Key key, double widthFactor, double heightFactor, Widget child })
: super(key: key, widthFactor: widthFactor, heightFactor: heightFactor, child: child);
}
3、例子
由于设置了heightFactor和widthFactor,表示父控件的宽高最大应该是子控件的1.5倍,所以父控件大小是300x300,则子控件就会在父控件的基础上居中显示。如果不设置heightFactor和widthFactor,则父控件则无限大,填充屏幕,则Center组件就在父控件的居中显示,即屏幕中间
Widget _buildColumn() {
return Container(
color: Colors.blueGrey,
child: Center(
heightFactor: 1.5,
widthFactor: 1.5,
child: Container(
height: 200,
width: 200,
color: Colors.blue[200],
),
),
);
}
1、简介
2、构造函数
const FittedBox({
Key key,
this.fit: BoxFit.contain,
this.alignment: Alignment.center,
Widget child,
})
填充模式
3、例子
常用的就是对图片的裁剪,也可以是对widget的裁剪,只要widget有固定的大小
Widget _buildColumn() {
return Container(
width: 300,
height: 300,
color: Colors.blue,
child: FittedBox(
fit: BoxFit.cover,
alignment: Alignment.centerLeft,
child: Image.asset("images/day27/girl.jpg"),
),
);
}
1、简介
2、构造函数
const AspectRatio({
Key key,
@required this.aspectRatio,
Widget child
})
3、例子
由于高度200是确定的,宽度是不确定的,而子控件的缩放比是1.5,最后子控件的大小宽为300,高为200
Widget _buildColumn() {
return Container(
height: 200.0,
color: Colors.blue,
child: AspectRatio(
aspectRatio: 1.5,
child: Container(
color: Colors.red,
),
),
);
}
1、简介
2、构造函数
ConstrainedBox({
Key key,
@required this.constraints,
Widget child
})
3、例子
约束子控件最小必须是100x100,最大必须是150x150
Widget _buildColumn() {
return ConstrainedBox(
constraints: BoxConstraints(
minWidth: 100.0,
minHeight: 100.0,
maxWidth: 150.0,
maxHeight: 150.0,
),
child: Container(
width: 200.0,
height: 200.0,
color: Colors.red,
),
);
}
1、简介
2、构造函数
const Baseline({
Key key,
@required this.baseline,
@required this.baselineType,
Widget child
})
3、例子
由于文字是具有baseline属性的,通过例子看出没有baseline属性的话,只能根据child的bottom对齐,文字则会在baseline上
Widget _buildColumn() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Baseline(
baselineType: TextBaseline.alphabetic,
child: Text("Java",style: TextStyle(fontSize: 20.0),),
baseline: 50.0,
),
Baseline(
//alphabetic:对齐字符底部的水平线
//ideographic:对齐表意字符的水平线
baselineType: TextBaseline.alphabetic,
child: Container(
width: 30,
height: 30,
color: Colors.blue[200],
),
baseline: 50.0,
),
Baseline(
baselineType: TextBaseline.alphabetic,
child: Text("iOS",style: TextStyle(fontSize: 30.0),),
baseline: 50.0,
),
],
);
}
1、简介
2、构造函数
const FractionallySizedBox({
Key key,
this.alignment = Alignment.center,
this.widthFactor,
this.heightFactor,
Widget child,
})
3、例子
不需要指定子控件的大小,通过FractionallySizedBox
约束子控件的大小为父控件的一半
Widget _buildColumn() {
return Container(
color: Colors.blue[600],
width: 200,
height: 200,
child: FractionallySizedBox(
alignment: Alignment.center,
widthFactor: 0.5,
heightFactor: 0.5,
child: Container(
color: Colors.blue[200],
),
),
);
}
1、简介
2、构造函数
const IntrinsicHeight({ Key key, Widget child })
3、例子
在IntrinsicHeight
子控件中放置四个相同宽度的容器,设置其中两个容器的高度为150和60,另外两个不设置,IntrinsicHeight
会找到最大的高度去限制其余容器
Widget _buildColumn() {
return IntrinsicHeight(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
color: Colors.blue,
width: 40.0,
height: 150.0,
),
Container(
color: Colors.red,
width: 40.0,
height: 60.0,
),
Container(color: Colors.yellow, width: 40.0),
Container(color: Colors.yellow, width: 40.0),
],
),
);
}
1、简介
2、构造函数
const IntrinsicWidth({ Key key, this.stepWidth, this.stepHeight, Widget child })
3、例子
设置stepHeight为200,但是父控件的高度不止200,该值不生效。设置stepWidth为150,但是其他child的控件最大宽度不超过150,则最小的宽度为150,即图中的灰色背景
Widget _buildColumn() {
return Container(
color: Colors.grey,
child: IntrinsicWidth(
//父容器的大小
stepHeight: 200,
stepWidth: 150,
child: Column(
children: [
Container(
color: Colors.blue,
width: 100.0,
height: 150.0,
),
Container(
color: Colors.red,
width: 60.0,
height: 150.0,
),
Container(color: Colors.yellow, height: 150.0),
Container(color: Colors.green, height: 150.0),
],
),
),
);
}
1、简介
2、构造函数
const LimitedBox({
Key key,
this.maxWidth = double.infinity,
this.maxHeight = double.infinity,
Widget child,
})
3、例子
由于是Row组件,Row组件的高度是被确定的,宽度是不限制的,所以高度限制不起作用,宽度限制起作用,最后宽度是150,高度是250
Widget _buildColumn() {
return Row(
children: [
LimitedBox(
maxHeight: 150, //由于是Row,高度被确定,所以高度限制不起作用
maxWidth: 150, //由于是Row,宽度不限制,所以宽度限制起作用
child: Container(
width: 250,
height: 250,
color: Colors.redAccent,
),
)
],
);
}
1、简介
2、构造函数
const Offstage({ Key key, this.offstage = true, Widget child })
3、例子
Widget _buildColumn() {
return Offstage(
offstage: false,
child: Container(
width: 250,
height: 250,
color: Colors.redAccent,
),
);
}
1、简介
2、构造函数
const OverflowBox({
Key key,
this.alignment = Alignment.center,
this.minWidth,
this.maxWidth,
this.minHeight,
this.maxHeight,
Widget child,
})
3、例子
子控件必须符合最小高度,所以最后出来的大小是300x600
Widget _buildColumn() {
return OverflowBox(
minHeight: 600,
child: Container(
width: 300,
height: 300,
color: Colors.blueAccent,
),
);
}
1、简介
2、构造函数
const SizedBox({ Key key, this.width, this.height, Widget child })
3、例子
Widget _buildColumn() {
return SizedBox(
width: 200,
height: 200,
child: Container(
color: Colors.blueAccent,
),
);
}
1、简介
2、构造函数
const SizedOverflowBox({
Key key,
@required this.size,
this.alignment = Alignment.center,
Widget child,
})
3、例子
控制child的尺寸大小为100x100
Widget _buildColumn() {
return SizedOverflowBox(
size: Size(100, 100),
alignment: Alignment.center,
child: Container(
width: 300,
height: 300,
color: Colors.blueAccent,
),
);
}
1、简介
2、构造函数
const Transform({
Key key,
@required this.transform,
this.origin,
this.alignment,
this.transformHitTests = true,
Widget child,
})
3、例子
让容器轻微的偏移上方,然后做居于自身的旋转效果
Widget _buildColumn() {
return Transform(
origin: Offset(0.0, 10.0),
transformHitTests: true,
alignment: Alignment.center,
transform: Matrix4.rotationZ(3.0),
child: Container(
width: 100,
height: 100,
color: Colors.blueAccent,
),
);
}
1、简介
2、构造函数
const CustomSingleChildLayout({
Key key,
@required this.delegate,
Widget child
})
3、例子
需要先创建一个代理类,将传递进来的参数Size作为预期尺寸,如果预期尺寸和当前子控件的尺寸不符合,则会重新让子控件设置新的约束来适应预期Size的尺寸
class FixedSizeLayoutDelegate extends SingleChildLayoutDelegate {
FixedSizeLayoutDelegate(this.size);
// 预期尺寸
final Size size;
@override
Size getSize(BoxConstraints constraints) => size;
@override
BoxConstraints getConstraintsForChild(BoxConstraints constraints) {
// 重新设置子控件的约束,让他适应预期Size的尺寸
return BoxConstraints.tight(size);
}
@override
bool shouldRelayout(FixedSizeLayoutDelegate oldDelegate) {
// 如果预期尺寸和当前子控件的尺寸不符合,则重新layout
return size != oldDelegate.size;
}
}
由于预期的尺寸是300x300,当前尺寸和预期不匹配,所以会将子控件调整到预期的尺寸
Widget _buildColumn() {
return CustomSingleChildLayout(
delegate: FixedSizeLayoutDelegate(Size(300, 300)),
child: Container(
width: 100,
height: 100,
color: Colors.blueAccent,
),
);
}