return BoxConstraints(
minWidth: minWidth.clamp(constraints.minWidth, constraints.maxWidth),
maxWidth: maxWidth.clamp(constraints.minWidth, constraints.maxWidth),
minHeight: minHeight.clamp(constraints.minHeight, constraints.maxHeight),
maxHeight: maxHeight.clamp(constraints.minHeight, constraints.maxHeight),
);
}
按照先前的布局原理来说,Container告诉父布局自己需要一个100x100的空间,而父布局也有充分的空间提供,那预期的效果应该会很好的呈现,可在这里由于ConstrainedBox内部改变了布局行为,导致预期结果不生效,ConstrainedBox会通过enforce函数衡量自身的约束属性即 _additionalConstraints,和父布局传递的约束,在其中取临近值,在这里由于父部件约束为:
BoxConstraints(
minWidth: double.infinity,
maxWidth: double.infinity,
minHeight: double.infinity,
maxHeight: double.infinity,
);
故所以_additionalConstraints的约束行为会被改成double.infinity~double.infinity之间的值即double.infinity。
案例二:奇怪的LimitedBox
现有这样两个场景:
ConstrainedBox(
constraints: BoxConstraints.tightFor(
width: double.infinity,
height: double.infinity),
child: UnconstrainedBox(
child: LimitedBox(
maxWidth: 100,
child:
Container(color: Colors.red, width: double.infinity, height: 100),
),
)
)
ConstrainedBox(
constraints: BoxConstraints.tightFor(
width: double.infinity,
height: double.infinity),
child: Center(
child: LimitedBox(
maxWidth: 100,
child:
Container(color: Colors.red, width: double.infinity, height: 100),
),
)
)
两者的区别不是很明显,只是前者的LimitedBox由UnconstrainedBox包裹,而后由Center包裹,但两个例子所展示的UI却大相径庭:
这样看来是Center致使LimitedBox的maxWidth约束失效了,为什么会这样呢?
// LimitedBox的布局过程
BoxConstraints _limitConstraints(BoxConstraints constraints) {
return BoxConstraints(
minWidth: constraints.minWidth,
// 判断是否有边界,如果有,则maxWidth会失效
maxWidth: constraints.hasBoundedWidth ? constraints.maxWidth : constraints.constrainWidth(maxWidth),
minHeight: constraints.minHeight,
maxHeight: constraints.hasBoundedHeight
-
? constraints.maxHeight
- constraints.constrainHeight(maxHeight),
);
}
@override
void performLayout() {
if (child != null) {
final BoxConstraints constraints = this.constraints;
child!.layout(_limitConstraints(constraints), parentUsesSize: true);
size = constraints.constrain(child!.size);
} else {
size = _limitConstraints(constraints).constrain(Size.zero);
}
}
bool get hasBoundedWidth => maxWidth < double.infinity;
引起LimitedBox的maxWidth失效的原因已经很明显了, 关键就在于这行代码:
constraints.hasBoundedWidth ? constraints.maxWidth : constraints.constrainWidth(maxWidth)
分为两种情况:
-
父布局传递constraints的hasBoundedWidth为true,这种情况下,maxWidth是肯定失效的
-
父布局必须是宽松布局才行,constraints.constrainWidth(maxWidth)会取constraints中的maxWidth临近值,所以紧布局也可能会使maxWidth失效。
所以这里LimitedBox的maxWidth约束是否失效的关键,在于父部件传递来的布局是否有边界,而Center和UnconstrainedBox在传递给子部件约束信息的处理上是有区别的: Center调用的constraints.loosen()方法,将当前约束进行松绑,而当前约束的hasBoundedWidth是不确定的!(依赖父部件)传递的约束。 UnconstrainedBox则重新构建的了一个无限大小的约束:childConstraints = const BoxConstraints(); 这样子部件是肯定可以收到一个hasBoundedWidth = false 并且为宽松特性的约束,所以在这里Center是有可能致使LimitedBox的maxWidth约束失效的,而UnconstrainedBox则可以百分百保证LimitedBox的布局行为符合预期。
===================================================================
约束确定后,想要绘制上屏,还缺一个很重要的属性——位置
子部件的大小是通过父类传递的约束来确定的,同样的,位置也是由父部件确定,以RenderBaseline为例,
@override
void performLayout() {
if (child != null) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
码笔记领取](https://bbs.csdn.net/topics/618156601)
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-I387hVAg-1711393569373)]
【算法合集】
[外链图片转存中…(img-xb5HkbVa-1711393569373)]
【延伸Android必备知识点】
[外链图片转存中…(img-4HR7pbq6-1711393569373)]
【Android部分高级架构视频学习资源】
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!