Flutter 中 Stack 的使用详解(内含对比图) _ Flutter Widgets(1)

],
)

Alignment 和 AlignmentDirectional 源码

// Alignment
class Alignment extends AlignmentGeometry {
/// Creates an alignment.
///
/// The [x] and [y] arguments must not be null.
const Alignment(this.x, this.y)
: assert(x != null),
assert(y != null);
static const Alignment topLeft = Alignment(-1.0, -1.0);
static const Alignment center = Alignment(0.0, 0.0);

}

// AlignmentDirectional
class AlignmentDirectional extends AlignmentGeometry {
const AlignmentDirectional(this.start, this.y)
: assert(start != null),
assert(y != null);
static const AlignmentDirectional topStart = AlignmentDirectional(-1.0, -1.0);
// 考虑使用 Alignment.center 代替
static const AlignmentDirectional center = AlignmentDirectional(0.0, 0.0);

}

上面我们贴出了核心源码,可以看出他俩都是继承自 AlignmentGeometry ,然后实现也是差不多,而且源码中的注释也是推荐我们使用 Alignment 代替

各种对齐方式效果

这里我们就使用 Alignment 了

Alignment.topLeftAlignment.topCenterAlignment.topRight
image.pngimage.pngimage.png
Alignment.centerLeftAlignment.centerAlignment.centerRight
image.pngimage.pngimage.png
Alignment.bottomLeftAlignment.bottomCenterAlignment.bottomRight
image.pngimage.pngimage.png
学点技巧

当我们输入 **Alignment.bottomRight** 这类参数时,因为单次比较长如果全部输入就太麻烦了,我们可以输入部分前缀+常量的首字母,如下

  • Alignment.bottomRight => alibr

image.png

  • Alignment.center => alic

image.png

阅读我得文章你会发现,不光有源码分析、结构化梳理还有各种实用的技巧,记得关注我哦

fit(填充方式)

为了展示效果,我们先添加一个背景 BgContainer (之前的篇章封装的通用组件)

BgContainer(
child: Stack(
// 居中
alignment: Alignment.center,
// 设置默认值 loose
fit: StackFit.loose,
children: [
getItem(3, width: 120, height: 120, color: Colors.purple),
getItem(2, width: 80, height: 80, color: Colors.blue),
getItem(1),
],
),
)

image.png

StackFit.loose (疏松的) - 默认

这里为了显示效果我们使用了 DevTools 中的 Widget Inspector 来调试布局,之后可能会聊 Flutter DevTools 的使用技巧(这里不做承诺,还是可能回聊)
image.png
通过上图可以看到此时 Stack 的大小取决于子项中最大的(也就是紫色 120 宽高的子项)

StackFit.expand(展开的)

image.png
这里似乎不是很符合预期,理论上不应该是扩展 Stack 到最大即可吗?

目前我们的子项都是没有设置定位的,所以此时所有的子类约束都会扩展到与Stack 最大值一致

添加定位

我们此时做一点点改变看看效果,先看代码

BgContainer(
child: Stack(
alignment: Alignment.center,
fit: StackFit.expand,
children: [
getItem(3, width: 120, height: 120, color: Colors.purple),
getItem(2, width: 80, height: 80, color: Colors.blue),
// 这添加了定位
Positioned(
// 距左边 10
left: 10,
// 距上边 10
top: 10,
child: getItem(1),
),
],
),
)

image.png
此时看到效果了,1 黄色 子项遵循了自己的约束,因为他添加了定位,其他 2、3 因为没有添加定位所以和 Stack 一样大,约束被传递。

这里我们暂时不讲定位的使用,下篇我们系统的聊

StackFit.passthrough(直穿的)

我们先看看效果
image.png
这里似乎和 loose 没有啥区别啊?我们可以看看源码后改变成以下的示例代码再看看

BgContainer(
// 添加了一个横向布局
child: Row(
children: [
// 添加了展开组件,前面讲过可以去专栏看看
Expanded(
child: Stack(
alignment: Alignment.center,
// 设置填充方式为 passthrough
fit: StackFit.passthrough,
children: [
getItem(3, width: 120, height: 120, color: Colors.purple),
getItem(2, width: 80, height: 80, color: Colors.blue),
Positioned(
left: 10,
top: 10,
child: getItem(1),
),
],
),
)
],
),
),
)

image.png
这里我们看到与 expand 还有些不同,这里我们只展开了宽度,高度还是子项的高度。因为这里 Stack 的宽度约束是展开的屏幕宽度,直接传递给了没有添加定位的子组件,所以看到 2、3 子组件跟着变了,而 1 子组件的大小没有发生变化。

如果是 loose 会怎样?

image.png

对于非定位组件会继续保持对齐方式和子项的约束

小总结

image.png

clipBehavior(剪裁行为)

为啥不聊 overflow 呢,因为本文是基于 Flutter 2.2.1 版本的,overflow 已经被弃用了,很多地方的剪裁行为以后都统一为 clipBehavior ,这参数我们之前在剪裁篇《Flutter 中各种剪裁 Widget 的使用》聊过,建议回看

当我们设置的子项定位后大小超过了 Stack 布局的时候,我们期望怎样剪裁渲染呢?是剪裁还是显示,是带抗锯齿还是不带呢?

BgContainer(
child: Stack(
alignment: Alignment.center,
fit: StackFit.passthrough,
// 设置剪裁行为默认 hardEdge
clipBehavior: Clip.hardEdge,
children: [
getItem(3, width: 120, height: 120, color: Colors.purple),
getItem(2, width: 80, height: 80, color: Colors.blue),
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

总而言之,Android开发行业变化太快,作为技术人员就要保持终生学习的态度,让学习力成为核心竞争力,所谓“活到老学到老”只有不断的学习,不断的提升自己,才能跟紧行业的步伐,才能不被时代所淘汰。

在这里我分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

0h-1712616109801)]

还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值