首先还是先看看构造方法里都有哪些参数
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,
}) : assert(margin == null || margin.isNonNegative),
assert(padding == null || padding.isNonNegative),
assert(decoration == null || decoration.debugAssertIsValid()),
assert(constraints == null || constraints.debugAssertIsValid()),
assert(color == null || decoration == null,
'Cannot provide both a color and a decoration\n'
'The color argument is just a shorthand for "decoration: new BoxDecoration(color: color)".'
),
decoration = decoration ?? (color != null ? new BoxDecoration(color: color) : null),
constraints =
(width != null || height != null)
? constraints?.tighten(width: width, height: height)
?? new BoxConstraints.tightFor(width: width, height: height)
: constraints,
super(key: key);
先来看特殊的部分:
- 这里有一大块内容是来描述
Color
和decoration
的。根据源码中的注释,这俩参数是不能同时赋值的,color
参数本身就是new BoxDecoration(color: color)
的简写方式。不管是给color赋值还是给decoration
赋值,最终都将会影响到decoration
,如果两个参数都没有赋值的话则decoration
为null
- 接下来就是
BoxConstraints constraints
参数
如果width
和height
都没有定义的话,则constraints
就取它自己本身的值,如果constraints
也没赋值,就为null。
如果constraints
没有赋值,只写了width
(或height
),则会直接创建一个尽可能小的BoxConstraint
const BoxConstraints.tightFor({
double width,
double height
}): minWidth = width != null ? width : 0.0,
maxWidth = width != null ? width : double.infinity,
minHeight = height != null ? height : 0.0,
maxHeight = height != null ? height : double.infinity;
如果constraints
和width
(或height
)同时有值的时候,则根据两者的约束重新生成一个尽可能符合两者的BoxConstraints
。其中的转换过程为:
/// Returns new box constraints with a tight width and/or height as close to
/// the given width and height as possible while still respecting the original
/// box constraints.
BoxConstraints tighten({ double width, double height }) {
return new BoxConstraints(minWidth: width == null ? minWidth : width.clamp(minWidth, maxWidth),
maxWidth: width == null ? maxWidth : width.clamp(minWidth, maxWidth),
minHeight: height == null ? minHeight : height.clamp(minHeight, maxHeight),
maxHeight: height == null ? maxHeight : height.clamp(minHeight, maxHeight));
}
关键是clamp
方法,clamp
具体怎么操作的这三个值的呢?举两个例子:
int origen = 10;
int result = origen.clamp(2, 11);
print(result);//结果为10
int origen = 10;
int result = origen.clamp(2, 9);
print(result);//结果为9
常规部分
- alignment 对齐方式
这个类里默认有几个常量,container可以理解为一个矩形,而这些常量分别代表container
中的九个位置,如图所示
九个常量示意图
如果除了这九个位置,想要自己随心所欲的放置child
则可以用:
const Alignment(this.x, this.y)
: assert(x != null),
assert(y != null);
这里的x和y可以看做一个坐标系,如图所示:
矩形部分代表
container
,中心部分为坐标系原点,原点到各个边的距离都是1,则根据比例,你可以把child
放到任何你想要放的位置
- 'padding'和
margin
这两个的含义想必是不用多说了,就说说怎么用吧
new Center(
child: new Container(
margin: const EdgeInsets.all(10.0),
color: const Color(0xFF00FF00),
width: 48.0,
height: 48.0,
),
)
一般会对应实现一个EdgeInsets对象,如果只需要对某个边进行padding
或margin
,或者四个边的值不一样的话,需要调用EdgeInsets.only()
方法,如果四个边的值一样的话可以直接用EdgeInsets.all()
方法,下面是它的源码:
const EdgeInsets.only({
this.left: 0.0,
this.top: 0.0,
this.right: 0.0,
this.bottom: 0.0
});
const EdgeInsets.all(double value)
: left = value, top = value, right = value, bottom = value;
- foregroundDecoration 顾名思义,这是画在
child
上面的装饰物 - transform 矩阵变化,注意:这个参数会应用在
Container
绘制之前
transform
对应一个Matrix4
对象,这里面也有一些常用的实现,比如旋转,平移之类的
网友评论