深色模式
Constraints 源码分析
Constraints的子类
Constraints
isTight
isNormalized
BoxConstraints
7个构造方法
BoxConstraints()
dart
const BoxConstraints({
this.minWidth = 0.0,
this.maxWidth = double.infinity,
this.minHeight = 0.0,
this.maxHeight = double.infinity,
});
这是最基本的构造方法,允许指定最小/最大宽高。
默认:
最小宽高
为0
最大宽高
为无限大
BoxConstraints.tight()
dart
BoxConstraints.tight(Size size)
: minWidth = size.width,
maxWidth = size.width,
minHeight = size.height,
maxHeight = size.height;
创建一个严格的约束,强制盒子必须是指定的大小:
最小宽度
=最大宽度
=size.width
最小高度
=最大高度
=size.height
BoxConstraints.tightFor()
dart
const BoxConstraints.tightFor({
double? width,
double? height,
}) : minWidth = width ?? 0.0,
maxWidth = width ?? double.infinity,
minHeight = height ?? 0.0,
maxHeight = height ?? double.infinity;
可以单独指定宽度或高度的严格约束:
- 如果指定了
width
,则minWidth
=maxWidth
=width
- 如果指定了
height
,则minHeight
=maxHeight
=height
- 未指定的维度采用默认值(最小
0
,最大无限
)
BoxConstraints.tightForFinite()
dart
const BoxConstraints.tightForFinite({
double width = double.infinity,
double height = double.infinity,
}) : minWidth = width != double.infinity ? width : 0.0,
maxWidth = width != double.infinity ? width : double.infinity,
minHeight = height != double.infinity ? height : 0.0,
maxHeight = height != double.infinity ? height : double.infinity;
与 tightFor
类似,但只对有限值进行严格约束:
- 如果
width
不是无限,则minWidth
=maxWidth
=width
- 如果
height
不是无限,则minHeight
=maxHeight
=height
- 对于无限值,采用默认约束(最小
0
,最大无限
)
BoxConstraints.loose()
dart
BoxConstraints.loose(Size size)
: minWidth = 0.0,
maxWidth = size.width,
minHeight = 0.0,
maxHeight = size.height;
创建一个宽松的约束:
最小宽高
为0
最大宽度
=size.width
最大高度
=size.height
允许盒子在 0
到指定大小
之间自由调整。
BoxConstraints.expand()
dart
const BoxConstraints.expand({
double? width,
double? height,
}) : minWidth = width ?? double.infinity,
maxWidth = width ?? double.infinity,
minHeight = height ?? double.infinity,
maxHeight = height ?? double.infinity;
创建一个扩展约束:
- 如果指定了
width
,则强制使用该宽度 - 如果指定了
height
,则强制使用该高度 - 未指定的维度将尽可能扩展(
最小值
=最大值
=无限
)
BoxConstraints.fromViewConstraints()
dart
BoxConstraints.fromViewConstraints(ui.ViewConstraints constraints)
: minWidth = constraints.minWidth,
maxWidth = constraints.maxWidth,
minHeight = constraints.minHeight,
maxHeight = constraints.maxHeight;
从视图约束创建盒子约束,直接使用视图约束的最小/最大宽高值。主要用于视图系统内部。
7个构造方法总结
BoxConstraints()
:基本构造方法,自由指定BoxConstraints.tight()
:宽高完全紧约束BoxConstraints.tightFor()
:宽高可选紧约束BoxConstraints.tightForFinite()
:宽高有限值紧约束BoxConstraints.loose()
:宽松约束到sizeBoxConstraints.expand()
:宽高可选紧约束扩展BoxConstraints.fromViewConstraints()
:复制提取约束
minWidth
maxWidth
minHeight
maxHeight
copyWith()
deflate()
loosen()
返回一个新约束对象,移除最小宽高约束,保留最大宽高限制。
dart
BoxConstraints loosen() {
return BoxConstraints(
maxWidth: maxWidth,
maxHeight: maxHeight,
);
}
这里最小宽高变成默认的0
。
enforce()
强制本约束的4个属性满足方法参数里的constraints
,计算以后返回一个新的BoxConstraints
。
dart
BoxConstraints enforce(BoxConstraints constraints) {
return BoxConstraints(
minWidth: clampDouble(minWidth, constraints.minWidth, constraints.maxWidth),
maxWidth: clampDouble(maxWidth, constraints.minWidth, constraints.maxWidth),
minHeight: clampDouble(minHeight, constraints.minHeight, constraints.maxHeight),
maxHeight: clampDouble(maxHeight, constraints.minHeight, constraints.maxHeight),
);
}
clampDouble()
方法,有3个参数,它检查第1个参数是否在第2与第3的区间里面,如果在,就返回它,如果不在就返回区间边界。
dart
double clampDouble(double x, double min, double max) {
assert(min <= max && !max.isNaN && !min.isNaN);
if (x < min) {
return min;
}
if (x > max) {
return max;
}
if (x.isNaN) {
return max;
}
return x;
}
tighten()
使用约束变紧,返回新约束。
dart
BoxConstraints tighten({ double? width, double? height }) {
return BoxConstraints(
minWidth: width == null ? minWidth : clampDouble(width, minWidth, maxWidth),
maxWidth: width == null ? maxWidth : clampDouble(width, minWidth, maxWidth),
minHeight: height == null ? minHeight : clampDouble(height, minHeight, maxHeight),
maxHeight: height == null ? maxHeight : clampDouble(height, minHeight, maxHeight),
);
}
对于width
参数非空:
- 如果它太小,则新约束的宽是紧的,取
minWidth
- 如果它太大,则新约束是宽是紧的,取
maxWidth
- 如果它在范围内,则新约束是宽是紧的,取
width
参数值
对于height
参数非空:
与上面类似。
get flipped
宽高属性对换