【Flutter】页面布局:弹性布局(Flex)
在 Flutter 开发中,布局是非常重要的部分。布局系统允许开发者控制和管理界面上的组件如何排列和展示。弹性布局(Flex
)是其中一个非常强大且常用的布局组件,它能够在水平方向或垂直方向上灵活调整子组件的空间分配比例。Row
和 Column
是 Flex
的特化实现,用于处理水平和垂直方向的布局。而 Flex
则更加通用,允许在多种场景下灵活配置。
本文将详细介绍 Flex
的使用场景、工作原理以及一些常见的使用方法,并通过实例展示如何使用弹性布局来构建灵活的 Flutter 界面。
什么是弹性布局?
在 Flutter 中,弹性布局(Flex
)是一种容器类的布局组件,它允许将子组件按一定比例分配空间。与 Row
和 Column
类似,Flex
也能让子组件在水平或垂直方向上排列,不同的是,Flex
允许更灵活地设置每个子组件的空间占比。
Flex
的两个重要属性:
- direction: 决定
Flex
布局的主轴方向,即子组件是水平排列还是垂直排列。它接受Axis.horizontal
和Axis.vertical
两个值,分别表示水平和垂直方向。 - children: 一个
Widget
列表,表示Flex
容器中的子组件。
Flex
的子组件通常会嵌套 Expanded
或 Flexible
来表示各个子组件在主轴方向上所占的空间比例。
Flex
的基本使用
Flex
允许开发者自由地决定组件的排列方向,并对子组件的布局进行灵活控制。下面通过一个简单的示例演示如何使用 Flex
实现弹性布局。
基本示例
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget { Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Flex 示例')),body: Flex(direction: Axis.horizontal,children: <Widget>[Expanded(flex: 2,child: Container(color: Colors.red,height: 100,),),Expanded(flex: 1,child: Container(color: Colors.green,height: 100,),),],),),);}
}
在这个示例中,Flex
容器的主轴方向为 Axis.horizontal
,表示水平布局。Expanded
被用来控制子组件的空间比例。第一个 Container
组件的 flex
值为 2,表示它将占用 2 份空间,而第二个 Container
的 flex
值为 1,占用 1 份空间。因此,红色的 Container
宽度是绿色的两倍。
Flex
的核心属性
direction
direction
决定 Flex
的主轴方向,它是一个枚举类型 Axis
,可以取以下两个值:
Axis.horizontal
: 水平方向排列子组件,类似于Row
。Axis.vertical
: 垂直方向排列子组件,类似于Column
。
mainAxisAlignment
控制子组件在主轴方向的排列方式。与 Row
和 Column
中的 mainAxisAlignment
属性相同,Flex
提供了一些常用的对齐方式:
MainAxisAlignment.start
: 从主轴起始位置开始排列(默认)。MainAxisAlignment.end
: 从主轴末尾开始排列。MainAxisAlignment.center
: 子组件在主轴上居中排列。MainAxisAlignment.spaceBetween
: 子组件在主轴上平均分布,首尾组件紧贴两端。MainAxisAlignment.spaceAround
: 子组件之间的间距相同,两端的间距是中间间距的一半。MainAxisAlignment.spaceEvenly
: 子组件之间的间距均等。
crossAxisAlignment
控制子组件在交叉轴方向的对齐方式。常见的对齐方式包括:
CrossAxisAlignment.start
: 子组件在交叉轴起始位置对齐。CrossAxisAlignment.end
: 子组件在交叉轴结束位置对齐。CrossAxisAlignment.center
: 子组件在交叉轴上居中对齐(默认)。CrossAxisAlignment.stretch
: 拉伸子组件以占满交叉轴。
mainAxisSize
控制 Flex
在主轴方向的尺寸大小。它有两个取值:
MainAxisSize.max
: 占满主轴上的所有可用空间(默认)。MainAxisSize.min
: 根据子组件的尺寸调整布局,只占据最小空间。
使用 Expanded
和 Flexible
在 Flex
布局中,Expanded
和 Flexible
是两个常用的子组件,它们允许开发者灵活控制子组件在主轴方向上的空间分配。
Expanded
Expanded
组件用于让子组件在 Flex
布局中占据尽可能多的空间,并且可以通过 flex
属性来控制占用比例。flex
属性的默认值是 1,表示等分空间。
Expanded(flex: 2,child: Container(color: Colors.blue,),
),
Expanded(flex: 1,child: Container(color: Colors.red,),
),
上面的代码中,第一个 Expanded
组件的 flex
值为 2,第二个的 flex
值为 1,表示第一个 Container
将占据两倍于第二个 Container
的空间。
Flexible
Flexible
与 Expanded
类似,但它允许子组件在主轴方向上有灵活的尺寸。Flexible
组件不会强制子组件填满可用空间,而是允许它根据自身内容调整大小。通过 fit
属性,Flexible
组件可以指定是尽可能填满空间还是根据内容包裹大小:
FlexFit.tight
: 子组件占满所有剩余空间(类似Expanded
)。FlexFit.loose
: 子组件可以根据自身大小调整,剩余空间不强制占满。
Flexible(fit: FlexFit.loose,child: Container(color: Colors.green,),
),
Flex
的复杂布局实例
通过 Flex
,可以轻松实现复杂的界面布局。下面是一个较为复杂的示例,展示如何使用 Flex
、Expanded
和 Flexible
来创建自适应布局。
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget { Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('复杂 Flex 布局示例')),body: Column(children: <Widget>[// 第一行,两个等分的子组件Flex(direction: Axis.horizontal,children: <Widget>[Expanded(child: Container(color: Colors.red,height: 100,child: Center(child: Text('左边', style: TextStyle(color: Colors.white))),),),Expanded(child: Container(color: Colors.blue,height: 100,child: Center(child: Text('右边', style: TextStyle(color: Colors.white))),),),],),SizedBox(height: 20), // 空间分隔// 第二行,三等分的子组件Flex(direction: Axis.horizontal,children: <Widget>[Expanded(child: Container(color: Colors.green,height: 100,child: Center(child: Text('左边', style: TextStyle(color: Colors.white))),),),Expanded(flex: 2, // 占用两倍空间child: Container(color: Colors.orange,height: 100,child: Center(child: Text('中间', style: TextStyle(color: Colors.white))),),),Expanded(child: Container(color: Colors.purple,height: 100,child: Center(child: Text('右边', style: TextStyle(color: Colors.white))),),),],),SizedBox(height: 20), // 空间分隔// 第三行,使用 Flexible 创建灵活布局Flex(direction: Axis.horizontal,children: <Widget>[Flexible(fit: FlexFit.loose,child: Container(color: Colors.teal,height: 100,child: Center(child: Text('左边', style: TextStyle(color: Colors.white))),),),Flexible(fit: FlexFit.loose,child: Container(color: Colors.pink,height: 100,child: Center(child: Text('右边', style: TextStyle(color: Colors.white))),),),],),],),),);}
}
总结
Flex
是 Flutter 中非常灵活和强大的布局组件,它允许开发者通过设置 direction
、mainAxisAlignment
和 crossAxisAlignment
等属性,轻松实现复杂的布局。同时,结合 Expanded
和 Flexible
,可以控制子组件在主轴方向上的空间分配和布局方式。
掌握 Flex
及其相关属性和组件的使用,是构建响应式 Flutter 界面的关键。在实践中,开发者会经常使用 Row
、Column
和 Flex
来创建布局结构,这些组件为构建灵活的 UI 提供了强大的支持。
相关文章:
【Flutter】页面布局:弹性布局(Flex)
在 Flutter 开发中,布局是非常重要的部分。布局系统允许开发者控制和管理界面上的组件如何排列和展示。弹性布局(Flex)是其中一个非常强大且常用的布局组件,它能够在水平方向或垂直方向上灵活调整子组件的空间分配比例。Row 和 Co…...
深入解析 Go 语言接口:多接口实现与接口组合的实际应用
文章目录 一、引言二、一个类型实现多个接口1. 定义多个接口2. 类型实现多个接口3. 使用多个接口 三、接口的组合1. 接口嵌套2. 实现复合接口 四、实际开发中的应用场景1. 多态与模块化设计2. 松耦合系统设计3. 测试与依赖注入4. 事件驱动架构中的应用 五、小结 一、引言 在 G…...

Eclipse——Java开发详解
Eclipse 1、配置JDK2、设置编译版本2.1、全局编译版本2.2、项目编译版本2.3、Web项目编译版本 3、设置工作目录4、创建Java项目5、配置Tomcat6、创建Web项目7、配置Maven8、创建Maven项目8.1、普通Maven项目8.2、Maven Web项目 9、创建SpringBoot项目10、设置字体11、设置代码提…...
练手小项目推荐
以下是一些练手项目推荐,我可以给你一些适合学生毕业设计的小项目建议,既可以锻炼技能,也能完成学术要求。以下是一些可行的毕业设计项目建议: 校园导航APP 功能:为校园内的新生和访客提供导航,标记教室、…...

一图秒懂色彩空间和色彩模型
色彩空间和色彩模型 想必学过图像处理或者摄影的小伙伴都知道这两个词,看了一些博客,发现很少有人把这两个概念说清楚的,大多数都是混在一起,色彩模型和色彩空间的概念混为一谈,很让人疑惑。 这里我们用一张图来解…...
控制Stable Diffusion生成质量的多种方法
在Stable Diffusion绘图中,控制AI生成图像的质量可以通过多种方法来实现。以下是几种常见的方法: 1. 从底模控制(Checkpoint) 使用不同的模型检查点(Checkpoints)可以显著影响生成图像的质量和细节。选择一…...

递归算法笔记
根据b站视频整理的 **视频地址:**https://www.bilibili.com/video/BV1S24y1p7iH/?spm_id_from333.788.videopod.sections&vd_source6335ddc7b30e1f4510569db5f2506f20 最常见的一个递归例子: 斐波那契数列:1,2,3…...
Android——发送彩信
跳转到相册选择图片 btn_jump.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {// 跳转到系统相册选择图片并返回Intent intent new Intent(Intent.ACTION_GET_CONTENT);// 设置图片类型为图片类型intent.setType("image/*&quo…...

对比迁移项目的改动
文章目录 对比迁移项目的改动场景背景解决方案 对比迁移项目的改动 场景背景 同源定制化项目,同一套代码扩展出来的项目(从领导口中得知) A项目的有三维地图展示,项目B跑起来却加载不出来,但是本地运行A项目代码&…...

数据结构-复杂度
复杂度 1.数据结构1.1算法 2.算法效率2.1复杂度的概念 3.时间复杂度3.1大O渐进表示法3.2时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例5:3.2.6 示例63.2.7 示例7 4.空间复杂度4.1.1 示例14.1.2 示例2 5.常见复杂度对比6.复杂度算法题6…...

无人机之放电速率篇
无人机的放电速率是指电池在一定时间内放出其储存电能的能力,这一参数对无人机的飞行时间、性能以及安全性都有重要影响。 一、放电速率的表示方法 放电速率通常用C数来表示。C数越大,表示放电速率越快。例如,一个2C的电池可以在1/2小时内放…...

免费开源AI助手,颠覆你的数字生活体验
Apt Full作为一款开源且完全免费的软件,除了强大的自然语言处理能力,Apt Full还能够对图像和视频进行一系列复杂的AI增强处理,只需简单几步即可实现专业级的效果。 在图像处理方面,Apt Full提供了一套全面的AI工具,包…...

VMware虚拟机三种网络模式详解
主要内容 1. 桥接模式2. NAT模式VMware Network Adapter VMnet8虚拟网卡的作用 3. 仅主机模式VMware Network Adapter VMnet1虚拟网卡的作用设置虚拟机联通外网 4. 总结 参考资料: 1.Vmware虚拟机三种网络模式详解 VMware虚拟机三种网络模式详解之Bridged࿰…...

【算法篇】动态规划类(4)——子序列(笔记)
目录 一、Leetcode 题目 1. 最长递增子序列 2. 最长连续递增序列 3. 最长重复子数组 4. 最长公共子序列 5. 不相交的线 6. 最大子序和 7. 判断子序列 8. 不同的子序列 9. 两个字符串的删除操作 10. 编辑距离 11. 回文子串 12. 最长回文子序列 二、动态规划总结 …...

【图解版】力扣第162题:寻找峰值
注意 题目只要求找到一个峰值就可以了。nums[-1]和nums[n]这两个位置是负无穷,也就是说,除了数组的位置之外,其它地方都是负无穷。对于所有有效的 i 都有 nums[i] ! nums[i 1] 方法一 遍历整个数组,找到最高的那个点。时间复杂…...

Windows电脑桌面如何弄个好用的提醒备忘录?
在这个充满挑战的时代,每个人都渴望成为更好的自己。然而,随着生活节奏的加快,我们时常发现自己陷入了各种琐事之中,难以脱身。为了不让重要的事情被遗漏,一款好的提醒备忘录工具就显得尤为关键。那么,Wind…...

Windows API 一 ----起步
目录 1.介绍主函数入口参数。 2. 简单介绍 Windows.h 这个头文件 小结,也聊一聊 1.介绍主函数入口参数。 第一个参数: HINSTANCE 类型的 参数, 称为“实例句柄“,这个参数唯一标志了我们写的这个程序。 第二个参数: HINSTANCE…...
音视频入门基础:H.264专题(19)——FFmpeg源码中,获取avcC封装的H.264码流中每个NALU的长度的实现
一、引言 从《音视频入门基础:H.264专题(18)——AVCDecoderConfigurationRecord简介》中可以知道,avcC跟AnnexB不一样,avcC包装的H.264码流中,每个NALU前面没有起始码。avcC通过在每个NALU前加上NALUnitL…...

【uniapp】设置公共样式,实现公共背景等
目录 1、 全局渐变背景色 2.1 创建common目录 2.2 在common下新建style和images等目录 2.3 在style下新建common-style.scss 2.4 common-style输入全局渐变颜色 2.5 引入样式 2.6 业务页面引入 2.7 展示 2、全局字体颜色 2.1 新建base-style.scss文件 2.2 设置base-…...

Node.js学习笔记
回顾: javascript 可以在浏览器运行 (js代码会JavaScript的解析引擎执行)chrome 》V8 (性能最好)FireFox 》 奥丁猴safri 》JSCoreIE浏览器 》查克拉JavaScript可以在浏览器端操作DOM 和BOM每一个浏览器都内置了B…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...

简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...