Flexible(弹性组件)
这里的 Flexible
和上篇聊的 Flex
看着有点像,实际上这两个的实现完全不一样,作用的组件也不一样,前者作用于整体子项的布局,后者作用于单个子项的布局。Flexible
的源码可以看看上篇,这里我们先看看 Flex
的源码也是很简单的。
flex
填充比例fit
可用空间填充方式child
嵌套的子 Widget
Flex 填充比例
// 横向布局(可以看上一篇)
Row(
children: [
Flexible(
// 第一个占用 1/6
flex: 1,
child: getItem(1),
),
Flexible(
// 第 2 个占用 2/6
flex: 2,
child: getItem(2),
),
Flexible(
// 第 3 个占用 3/6
flex: 3,
child: getItem(3),
),
],
)
getItem
/// 获取子项目(这里使用了位置参数)
Widget getItem(int index, [double width = 60, double height = 60]) {
return Container(
// 宽高设置 60
width: width,
height: height,
// 设置背景色
color: Colors.orange.shade200,
// 设置间隙
margin: EdgeInsets.all(2),
// 设置子项居中
alignment: Alignment.center,
// 设置子项
child: Text(‘$index’),
);
}
}
看效果
What? 按照常识来讲这不符合预期啊,刚才上面看到 fit
参数默认是 FlexFit.loose
并且这里 getItem
子项的宽高设置成了 60
,所以会出现上面的现象。
做些修改
这里我们将 getItem
改为 getItem(1, null, 60)
设置为不限制宽度,看看效果
Flexible(
flex: 1,
fit: FlexFit.loose,
child: getItem(1, null, 60),
)
这下就符合我们的预期了,我们再来做一些调整, getItem
不变,仅把 fit
参数改为 FlexFit.tight
看看效果
Flexible(
flex: 1,
fit: FlexFit.tight,
child: getItem(1),
)
这里也符合我们的预期,这是为什么呢?
因为 FlexFit.loose 允许子项与最大的可用空间(1/6)一样大,但是可以更小,我们开始设置了子项宽度是 60 ,所以就是 60 了,不设置子项宽度就是按照允许的最大空间来了。 因为 FlexFit.tight 被迫会将子类填充可用空间(1/6),所以设置后即使我们设置了子项宽度也没有作用
小结一下
- flex 可用空间比例
- fit 子项可用空间填充方式
- FlexFit.loose 允许子项 <= 可用空间
- FlexFit.tight 子项 == 可用空间
Expanded(展开的)
这个 Widget 也是非常常用的,有了前面的理解,现在我们看看他的实现,就秒懂什么意思了,一起来
看到他继承自 Flexible
你就差不多懂了吧,然后我们再看看他 fit
设置的 FlexFit.tight
(子项 == 可用空间),现在来看看下面的代码,你说效果是什么?
Row(
children: [
Expanded(
flex: 1,
child: getItem(1),
),
Expanded(
flex: 2,
child: getItem(2),
),
Expanded(
flex: 3,
child: getItem(3),
),
],
)
对了,正如你所料,他和上面我们 Flexible
展示的最后一个示例效果是一样的。
应用场景
先看看下面简单的异常效果
实现代码如下
Row(
children: [
getItem(1),
Text(
‘ZeroFlutter 聊 Expanded,ZeroFlutter 聊 ExpandedZeroFlutter 聊 ExpandedZeroFlutter 聊 ExpandedZeroFlutter 聊 ExpandedZeroFlutter 聊 Expanded’)
],
)
一般我们都要考虑适配性,你想要的可能是这样的
实现代码如下,我们使用 Expanded
包裹 Text
,然后设置了最多 2 行,超过 … 显示
Row(
children: [
getItem(1),
// 使用 Expanded 包裹 Text
Expanded(
child: Text(
‘ZeroFlutter 聊 Expanded,ZeroFlutter 聊 ExpandedZeroFlutter 聊 ExpandedZeroFlutter 聊 ExpandedZeroFlutter 聊 ExpandedZeroFlutter 聊 Expanded’,
overflow: TextOverflow.ellipsis,
maxLines: 2,
),
)
],
)
Spacer(弹片)
这个 Widget 可能你是第一次听说,但是从此以后你可能就会经常用到他了,非常好用,比如说我们要做到如下效果,你会怎么做?
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!