Flutter 弹性布局的基石: flex 和 flexible

2023-11-01

Flutter 弹性布局的基石 是 flex 和 flexible。理解了这两个 widget,后面的row,column 就都轻而易举了。本文用示例的方式详细介绍 flex 的布局算法。

flex 布局算法

  1. 先布局 flex 为 0 或 null 的 child。在 main 轴上 child 受到的约束是 unbounded。如果 crossAxisAlignment 是 CrossAxisAlignment.stretch, 在 cross 轴上的约束是 tight,值是 cross 轴上收到约束的最大值。否则,在 cross 轴上的约束是 loose。

  2. 为 flex 不为 0 的 child 申请空间,flex 值越大,按比例得到的可以占用的空间越大。

  3. 为 flex 不为 0 的 child 分配空间。main 轴方向的最大值是第二步申请到的空间的值。如果 child 的fit 参数为 FlexFit.tight,child在主轴方向 受到 tight 约束,值为第二步申请到的空间的值。如果 child 的 fit 参数为 FlexFit.loose,child在主轴方向 受到 loose 约束。child在主轴方向可以任意小,但不能超第二步申请到的空间的值。

  4. flex cross 轴的高度是能包住所有 child,并不超过最大约束。

  5. flex main 轴的宽度与 mainAxisSize 有关。如果 mainAxisSize 是 MainAxisSize.max,main 轴的宽度是最大约束值,否则是能包住所有child ,但不超过最大约束。

  6. flex自己的尺寸和 child 的尺寸确认后,根据 mainAxisAlignment 和 crossAxisAlignment 摆放 child。

看了算法并不直观,下面通过实例讲解。

非弹性组件在 main 轴受到的约束是 unbounded

```
Flex(
direction: Axis.horizontal,
children: [
Container(
width: 1000,
height: 100,
color: Colors.red[200],
),
],
)


我们看到,Flex 在主轴的约束是 unbounded,所以 container 可以取值 1000,超出屏幕,显示警告。

flex 值越高,可以分到的空间越大。但能否占满空间取决于 fit 参数
------------------------------------

![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c27abc9da268421a8c38ffc11567765f~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?)```
Flex(
      direction: Axis.horizontal,
      children: [
        Flexible(flex:2 ,child: Container(width: 50,height: 80,color: Colors.green,),),
        Flexible(flex:1, child: Container(width: 100,height: 50,color: Colors.blue[300],),),
        Container(width: 50,height: 100,color: Colors.red[200],
        ),
      ],
    )

假设宽一共 200,布局过程:

  1. 先分配非弹性 child 红色块 50。
  2. 绿色和蓝色块是弹性块,它们会瓜分剩下的 150,按 flex 值,绿色块应该分 100,蓝色块分 50。
  3. 绿色块的 fit 值是 loose,flex 不强制它把空间占满,所以它只点了 50。蓝色块的 fit 值 是 loose,它的 width 比 50 大 flex 会强制它的宽度为 50。效果就是右边还剩下 50,那本来是分给绿色块的。

如果绿色块的 fit 值修改为 FlexFit.tight,剩下的空间就会被占满了,这个时候 width 会被忽略。

flexible 的作用就是为了修改 child 的 parentData,给 child 增加 fit, flex 布局信息。让 flex 根据这些信息为 child 布局。

Expanded

class Expanded extends Flexible {
  const Expanded({
    super.key,
    super.flex,
    required super.child,
  }) : super(fit: FlexFit.tight);
}

Expanded 其实就是 fit 固定为 FlexFit.tight 的 flexible。其实可以直接用 flexible 的,但因为 Expanded 太常用了,所以单独加了一个类。同时 Expanded 也更加有语义。Expanded 和 flexible 的关系就像 Center 和 Align的一样。

Spacer

class Spacer extends StatelessWidget {

  const Spacer({super.key, this.flex = 1})
    : assert(flex != null),
      assert(flex > 0);

  final int flex;

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: flex,
      child: const SizedBox.shrink(),
    );
  }
}

Spacer 的 child 是 SizedBox.shrink(),用来占位,没有实际的意义。Spacer 是 Expanded 的包装,就是为了占空位用的。

至于摆放 child 的规则大同小异,如果有不明白的同学可以看 这篇 Flutter Wrap 图例

Flex 和 Flexible 如果都掌握了,Row 和 Colmn 自然就会了。因为 Row 只是 direction 为 Axis.horizontal 的 Flex,Column 只是 direction 为 Axis.vertical 的 Flex。

作者:IAM17
原文链接:(https://juejin.cn/post/7180962741950087224)

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集在这里插入图片描述
二、源码解析合集
在这里插入图片描述

三、开源框架合集
在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 弹性布局的基石: flex 和 flexible 的相关文章

  • startActivity overridePendingTransition 只显示进入动画

    基本上 我遇到的问题是只显示输入幻灯片动画 调用 Activity 不会产生动画 startActivity intent overridePendingTransition R anim right in partly R anim le
  • 添加动态数据时 footable 出现问题

    我需要 jQuery Mobile 方面的一些帮助富表 http css tricks com footable a jquery plugin for responsive data tables 我正在表中动态添加数据 HTML tab
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 编译后从字节代码中删除注释

    我们正在使用一个包含使用 JAXB 注释进行注释的 bean 的库 我们使用这些类的方式完全不依赖于 JAXB 换句话说 我们不需要 JAXB 也不依赖注释 但是 由于注释存在 它们最终会被处理注释的其他类引用 这要求我将 JAXB 捆绑到
  • 如何将 Android Instrumentation 测试推送到模拟器/设备?

    我正在尝试使用 Ubuntu 9 04 中的命令行 shell 在 Android 模拟器上运行 Webkit 布局测试 adb s emulator 5554 shell am instrument w com android dumpr
  • Android Facebook sdk 3.5 分享对话框

    您好 我正在为 android sdk 3 5 实现 facebook 共享对话框 但是我按照指南没有取得任何成功 FacebookDialog shareDialog new FacebookDialog ShareDialogBuild
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 在 Android 中始终以横向模式打开相机

    在我的 Android 应用程序中 单击按钮后我希望相机以横向模式打开 即使我将手机旋转为纵向模式 相机也应始终处于横向模式或纵向模式 使用此代码在横向模式下打开相机 Intent cameraIntent new Intent Media
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • 如何在Android网格视图中设置单元格大小?

    我正在尝试为应用程序制作一个带有大图标的网格视图 但我找不到任何有关修改 Android 上网格布局上的单元格大小的教程 有人可以给我一个例子或相关链接吗 Thanks 就像另一个一样适配器视图 http developer android
  • 按名称获取 ArrayList

    这是正确的获取方式吗ArrayList
  • 有没有办法在多个嵌套的 RecyclerView 之间共享同一个 LayoutManager

    我正在开发一个显示游戏列表的应用程序 在每个游戏的 itemView 内 我还有一个要显示的视频列表 预览和结构如下 我部署了一个RecyclerView作为窗口根视图 然后对于视频 我使用网格样式的RecyclerView来显示 所以这里
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • 如何在 kotlin 中检查 lambda 空值

    在 Kotlin 中如何检查 lambda 是否为空 例如 我有这样的签名 onError Throwable gt Unit 我如何区分它的默认值是应用于主体还是应用于此函数的值 您无法测试 lambda 的主体是否为空 因此它不包含源代
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb

随机推荐

  • 嵌入式开发——常见的存储器分类和特性介绍

    1 存储器的组成 存储器大体上由 存储颗粒 控制电路 组成 存储颗粒负责存储数据 控制电路负责管理存储颗粒和对外交换数据 如果从存储颗粒上进行分类 就是以是否掉电丢失 是否随机寻址 是可读还是可写 是否需要初始化等标准进行分类 如果从控制电
  • 32_STM32内部温度传感器实验

    目录 内部温度传感器简介 STM32ADC对应引脚 内部温度传感器使用注意使用事项 开启内部温度传感器步骤 实验源码 内部温度传感器简介 内部温度传感器框图 从图上可以看出温度传感器可通过TSVREFR控制位连接到ADC的固定通道16 温度
  • hive update和delete报错Attempt to do update or delete using transaction manager

    转载自 levy cui 默认在hive中没有默认开启支持单条插入 update 更新以及删除 delete 操作 需要自己配置 而在默认情况下 当用户如果使用update和delete操作时 会出现如下情况 hive gt update
  • 灰度重心法提取光条纹中心

    灰度重心法提取激光光条纹中心其实是将光条纹截面的灰度值分布中的质心记作为光条纹的中心 在一列线激光中先利用极值法求取光强最大的一点gmax 然后确定一个阀值 gmax g 取10 20 在阈值两边判断大于 的元素 求出其重心位置作为光条纹的
  • Open3D (C++) 计算距离最大的点

    目录 一 概述 二 代码实现 三 结果展示 一 概述 给定一个点 求距离该点最远的点 二 代码实现 include
  • 2018年数学建模国赛A题题目、解题思路、matlab代码(四)

    题目 消防和金属冶金等行业常常需要工作人员在高温环境中作业 高温作业专用服装可以较好地吸收部分热量 使得工作人员体表温度不至于过高从而避免灼伤 所以高温作业服必不可少 通常作业服由三层材料构成 记为 I II III 层 其中 I 层与外界
  • vue2自定义插件

    1 新建插件文件夹 plugin 新建文件 index js index vue index vue
  • 8款让你轻松写出优秀年中总结的神器!

    又到年中总结的时候了 不知道怎么写总结呢 今天就给大家推荐8款写作神器 第一款 ChatGPT ChatGPT是由OpenAI创建的基于人工智能自然语言处理技术的系统 旨在进行自然流畅的对话并提供连贯且相关的回复 ChatGPT使用了GPT
  • 夜深人静学32系列16——RTC实时时钟

    RTC时钟 RTC 什么是RTC RTC结构框图 CubeMX配置 RTC代码配置 实战 简易时钟 任务要求 代码实现 实验结果 补充 唤醒功能配置 代码如下 RTC 什么是RTC RTC Real Time Clock 实时时钟 RTC是
  • Jmeter性能测试(性能测试,Jmeter使用与结果分析)

    每天进步一点点 关注我哦 每天分享测试技术文章 前言 一 性能测试 1 什么是性能测试 2 性能测试的重要性 3 性能指标 QPS和TPS QPS TPS 二 压测工具Jmeter 1 什么是Jmeter 2 Jmeter主要元件 3 下载
  • Cloudflare Worker 部署纯静态网站

    安装 Wrangler CLI npm i cloudflare wrangler g 或者 cargo install wrangler 创建一个空白网站模板 wrangler generate proj site ref 文档 http
  • element-plus 按钮在一些浏览器中无法显示问题

    正常按钮样式 在360浏览器或者chrome 88以下版本浏览器中的按钮样式 分析 not 选择器的写法不兼容 not a b 这种伪类不支持 解决方案 postcss selector not 插件文档地址 postcss一个插件 用来将
  • Altium Designer(AD)常用操作和快捷方式

    方格与格点的切换 View Grids ToggleVisible Grid Kind 原点 Edit Origin Set 边界的定义 Keep Out Layer Utility Tools Place Line 按TAB可定义线宽 选
  • 苹果连不上电脑服务器未响应,苹果电脑服务器未响应怎么办

    苹果Mac应用无响应 死机了怎么办 这里我们根据系统的优先级提供了多种关闭应用预防死机的方式 请大家按照苹果关闭应用的优先级方式 逐级使用关闭应用的释放防止死机 下面和学习啦小编一起来学习一下苹果电脑服务器未响应怎么办 苹果电脑未响应的解决
  • ModuleNotFoundError: No module named ‘sklearn‘【有效】

    ModuleNotFoundError No module named sklearn 有效 题目描述 解题思路一 题目描述 Traceback most recent call last File import sklearn Modul
  • es聚合结果返回所有字段

    使用topHit aggregation size 0 query match all aggregations questionAgg terms field faqQuestion size 100 aggregations faqFe
  • 实战分享:GNSS知识汇总

    大家好 我是阿荣 感恩遇见 本文部分图文来源于网络 并经过整合 编辑和勘误 实战分享栏目将重点介绍嵌入式的基础知识 并融合一些实战经验 持续勘误和迭代 建议关注和收藏 WX同名 导行定位在嵌入式解决方案中是个常客 借助其功能 产生了许许多多
  • C程序设计--VC++6.0的使用(常用快捷键)

    VC 默认没有设置打开 关闭工作区和打开 关闭输出区的快捷键 我们可以自己注册 注册方法 Tools gt Customize gt KeyBoard 编辑常用键 Ctrl N New新建工程 Ctrl O Open打开文件 Alt F3
  • Web攻击常见攻击方式及防范方案

    Web攻击 WebAttack 是针对用户上网行为或网站服务器等设备进行攻击的行为 如植入恶意代码 修改网站权限 获取网站用户隐私信息等等 Web应用程序的安全性是任何基于Web业务的重要组成部分确保Web应用程序安全十分重要 即使是代码中
  • Flutter 弹性布局的基石: flex 和 flexible

    Flutter 弹性布局的基石 是 flex 和 flexible 理解了这两个 widget 后面的row column 就都轻而易举了 本文用示例的方式详细介绍 flex 的布局算法 flex 布局算法 先布局 flex 为 0 或 n