【Flutter 布局】001-Flex 布局

news2024/11/19 3:44:09

【Flutter 布局】001-Flex 布局

文章目录

  • 【Flutter 布局】001-Flex 布局
  • 一、Flex
    • 1、概述
      • 简介
      • 构造函数
    • 2、基本使用
      • 代码示例
      • 运行结果
    • 3、方向
      • 取值范围
      • 代码示例
    • 4、水平方向:主轴对齐方式
      • 取值范围
      • 代码示例
      • 运行结果
    • 5、垂直方向:主轴对齐方式
      • 代码示例
      • 运行结果
    • 6、主轴尺寸
      • 取值范围
      • 代码示例:`MainAxisSize.max`
      • 运行结果
      • 代码示例:`MainAxisSize.min`
      • 运行结果
    • 7、交叉轴对其方式
      • 取值范围
      • 水平方向:代码示例:`CrossAxisAlignment.center`
      • 运行结果
      • 垂直方向:代码示例:`CrossAxisAlignment.center`
      • 运行结果
    • 8、水平方向:子项顺序
      • 取值范围
      • 代码示例
      • 运行结果
    • 9、垂直方向:子项顺序
      • 取值范围
      • 代码示例
      • 运行结果
    • 10、文本基线
      • 取值范围
      • 代码示例
      • 运行结果
    • 11、剪辑行为
      • 取值范围
      • 代码示例
  • 二、Row
    • 1、概述
      • 简介
      • 源代码
    • 2、基本使用
      • 代码示例
      • 运行结果
  • 三、Column
    • 1、概述
      • 简介
      • 源代码
    • 2、基本使用
      • 代码示例
      • 运行结果

一、Flex

1、概述

简介

Flex 是 Flutter 中的一个小部件,用于创建一个弹性布局容器。它允许在一个轴上按比例分配可用空间,并根据需要调整子项的大小。

Flex 小部件有两个重要的属性:directionchildren

  • direction:指定了弹性容器的主轴方向。可以是水平方向(Axis.horizontal)或垂直方向(Axis.vertical)。
  • children:包含在弹性容器中的子项列表。

Flex 使用一种类似于弹性盒子模型的方式来布局子项。子项可以使用 Expanded 小部件来指定它们在弹性容器中的相对比例。通过在子项中使用 Expanded,可以根据需要调整子项的大小,并在弹性容器的主轴上按比例分配可用空间。

构造函数

const Flex({
    super.key,
    required this.direction,
    this.mainAxisAlignment = MainAxisAlignment.start,
    this.mainAxisSize = MainAxisSize.max,
    this.crossAxisAlignment = CrossAxisAlignment.center,
    this.textDirection,
    this.verticalDirection = VerticalDirection.down,
    this.textBaseline,
    this.clipBehavior = Clip.none,
    super.children,
}) : assert(!identical(crossAxisAlignment, CrossAxisAlignment.baseline) || textBaseline != null, 'textBaseline is required if you specify the crossAxisAlignment with CrossAxisAlignment.baseline');

2、基本使用

代码示例

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.horizontal,
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    )

运行结果

image-20230611122948523

3、方向

取值范围

Axis 是一个枚举类型,用于表示二维空间中的两个基本方向。

以下是 Axis 的两个取值及其含义:

  • horizontal:水平方向,表示从左到右的方向。
  • vertical:垂直方向,表示从上到下的方向。

代码示例

参考主轴对齐方式

4、水平方向:主轴对齐方式

取值范围

MainAxisAlignment 是一个枚举类型,用于指定在 Flex 布局中子级容器沿主轴(main axis)的对齐方式。

以下是 MainAxisAlignment 的各个取值及其含义:

  • start:尽可能靠近主轴的起始位置放置子级容器。
  • end:尽可能靠近主轴的结束位置放置子级容器。
  • center:将子级容器放置在主轴的中间位置。
  • spaceBetween:在子级容器之间均匀分布剩余空间。
  • spaceAround:在子级容器之间均匀分布剩余空间,并在第一个和最后一个子级容器之前及之后分配剩余空间的一半。
  • spaceEvenly:在子级容器之间均匀分布剩余空间,并在第一个和最后一个子级容器之前及之后分配相等的剩余空间。

代码示例

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.horizontal,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611124548242

5、垂直方向:主轴对齐方式

代码示例

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.vertical,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
            Container(color: Colors.red, width: 100, height: 100, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 100, height: 100, child: const Text('Hello World')),
            Container(color: Colors.green, width: 100, height: 100, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611124732231

6、主轴尺寸

取值范围

MainAxisSize 是一个枚举类型,用于控制在主轴上子级容器应该占据多少空间。

在进行 Flex 布局时,沿主轴的可用空间会被分配给子级容器。在分配空间后,可能会有一些剩余的空闲空间。MainAxisSize 控制是否最大化或最小化空闲空间的量,同时受到传入的布局约束的限制。

以下是 MainAxisSize 的两个取值及其含义:

  • min最小化主轴上的空闲空间的量,受传入的布局约束的限制。如果传入的布局约束的 BoxConstraints.minWidthBoxConstraints.minHeight 足够大,可能仍会有非零的空闲空间。如果传入的布局约束是无界的,并且任何子级容器具有非零的 FlexParentData.flex 值和 FlexFit.tight 的适应方式(由 Expanded 应用),则 RenderFlex 将断言,因为会存在无限剩余的空闲空间,而不能给予盒子无限的大小。
  • max最大化主轴上的空闲空间的量,受传入的布局约束的限制。如果传入的布局约束的 BoxConstraints.maxWidthBoxConstraints.maxHeight 足够小,可能仍然没有空闲空间。如果传入的布局约束是无界的,RenderFlex 将断言,因为会存在无限剩余的空闲空间,而不能给予盒子无限的大小。

代码示例:MainAxisSize.max

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.horizontal,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611125337499

代码示例:MainAxisSize.min

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.horizontal,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.min,
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    )

运行结果

image-20230611125433412

7、交叉轴对其方式

交叉轴意思就是对应轴,主轴是水平方向,交叉轴就是垂直方向,反之亦然!

取值范围

CrossAxisAlignment 是一个枚举类型,用于确定在 Flex 布局中子级容器沿交叉轴的对齐方式。

以下是 CrossAxisAlignment 的取值及其含义:

  • start:将子级容器的起始边与交叉轴的起始边对齐。例如,在一个垂直方向(具有垂直轴)的列(Column)中,如果文本方向为从左到右(TextDirection.ltr),则子级容器的左边将与列的左边对齐。如果在水平方向使用此值,则需要提供 TextDirection 来确定起始边是左边还是右边。如果在垂直方向使用此值,则需要提供 VerticalDirection 来确定起始边是顶部还是底部。
  • end:尽可能地将子级容器与交叉轴的末端对齐。例如,在一个垂直方向(具有垂直轴)的列(Column)中,如果文本方向为从左到右(TextDirection.ltr),则子级容器的右边将与列的右边对齐。如果在水平方向使用此值,则需要提供 TextDirection 来确定末端是左边还是右边。如果在垂直方向使用此值,则需要提供 VerticalDirection 来确定末端是顶部还是底部。
  • center:将子级容器的中心与交叉轴的中心对齐。这是默认的交叉轴对齐方式。
  • stretch:要求子级容器填充交叉轴。这会导致传递给子级容器的约束在交叉轴上变为紧密约束。
  • baseline:将子级容器沿交叉轴以使其基线对齐。由于基线始终是水平的,所以该对齐方式适用于水平的主轴。如果主轴是垂直的,则此值会被视为 start。对于水平的主轴,如果传递给 Flex 布局的最小高度约束超过了交叉轴的内在高度,子级容器将尽可能靠近顶部对齐,同时保持基线对齐。换句话说,额外的空间将位于所有子级容器的下方。没有基线的子级容器将与顶部对齐。

水平方向:代码示例:CrossAxisAlignment.center

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.horizontal,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 200, height: 200, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611125825234

垂直方向:代码示例:CrossAxisAlignment.center

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.vertical,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
            Container(color: Colors.red, width: 200, height: 200, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 100, height: 100, child: const Text('Hello World')),
            Container(color: Colors.green, width: 200, height: 200, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611125957767

8、水平方向:子项顺序

取值范围

TextDirection 是一个枚举类型,用于表示文本的方向。

以下是 TextDirection 的取值及其含义:

  • rtl:文本从右到左流动,例如阿拉伯语、希伯来语等。
  • ltr:文本从左到右流动,例如英语、法语等。

代码示例

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.horizontal,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        textDirection: TextDirection.rtl,
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 200, height: 200, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611130453910

9、垂直方向:子项顺序

取值范围

VerticalDirection 是一个枚举类型,用于确定垂直方向上的方向。

以下是 VerticalDirection 的取值及其含义:

  • up:子级容器应从底部开始,并沿垂直方向堆叠到顶部。在此情况下,“start” 在底部,“end” 在顶部。
  • down:子级容器应从顶部开始,并沿垂直方向堆叠到底部。在此情况下,“start” 在顶部,“end” 在底部。

代码示例

Container(
    color: Colors.white,
    child: Flex(
        direction: Axis.vertical,
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        verticalDirection: VerticalDirection.up,
        children: [
            Container(color: Colors.red, width: 200, height: 200, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 150, height: 150, child: const Text('Hello World')),
            Container(color: Colors.green, width: 200, height: 200, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611130847259

10、文本基线

取值范围

TextBaseline 是一个枚举类型,用于指定文本对齐时使用的水平线。

以下是 TextBaseline 的取值及其含义:

  • alphabetic:用于对齐字母字符底部的水平线。
  • ideographic:用于对齐表意字符的水平线。

代码示例

两个取值暂未看出明显区别,暂不做深究!

Container(
    color: Colors.white,
    child: const Flex(
        direction: Axis.horizontal,
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.baseline,
        textBaseline: TextBaseline.alphabetic,
        children: [
            Text('Hello World,Hello World,Hello World,\r\nHello World,Hello World,Hello World', style: TextStyle(fontSize: 50)),
            Text('訾博', style: TextStyle(fontSize: 30)),
        ],
    ),
)

运行结果

image-20230611132218749

11、剪辑行为

取值范围

枚举类型 Clip 是用于指定小部件内容剪辑方式的选项。

以下是 Clip 的取值及其含义:

  • none:没有剪辑。这是大多数小部件的默认选项。如果内容没有超出小部件的边界,不会进行任何剪辑,也不会产生性能开销。如果内容超出边界,则需要显式指定其他的剪辑选项。
  • hardEdge:剪辑内容,但不应用反锯齿。这种方式会导致剪辑边缘呈锯齿状,适用于容器为轴对齐矩形或轴对齐圆角矩形且圆角半径非常小的情况。比起其他剪辑模式,速度较快但比 none 模式慢。
  • antiAlias:剪辑内容并应用反锯齿。这种方式会使剪辑边缘呈现平滑的外观。速度比 antiAliasWithSaveLayer 快,但比 hardEdge 模式慢。在处理圆形和弧形时常用的方式。
  • antiAliasWithSaveLayer:剪辑内容并应用反锯齿,同时在剪辑后立即创建一个离屏缓冲区。所有后续绘制操作都在该缓冲区上进行,最后再进行剪辑和合成。这种方式非常慢,但与 antiAlias 不同,它会引入一个离屏缓冲区,改变了绘制的语义。这种方式很少使用,仅在特定情况下才需要,例如在图像上叠加不同背景颜色时。如果可以避免在同一位置叠加多个颜色(例如只在图像缺失的地方使用背景颜色),则使用 antiAlias 模式会更快速。

代码示例

代码示例看不出特别效果,暂不做深究。

二、Row

1、概述

简介

Row = Flex + direction: Axis.horizontal

源代码

class Row extends Flex {
  const Row({
    super.key,
    super.mainAxisAlignment,
    super.mainAxisSize,
    super.crossAxisAlignment,
    super.textDirection,
    super.verticalDirection,
    super.textBaseline,
    super.children,
  }) : super(
    direction: Axis.horizontal,
  );
}

2、基本使用

代码示例

Container(
    color: Colors.white,
    child: Row(
        children: [
            Container(color: Colors.red, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.blue, width: 300, height: 300, child: const Text('Hello World')),
            Container(color: Colors.green, width: 300, height: 300, child: const Text('Hello World')),
        ],
    ),
)

运行结果

image-20230611122948523

三、Column

1、概述

简介

Column = Flex + direction: Axis.vertical

源代码

class Column extends Flex {
  const Column({
    super.key,
    super.mainAxisAlignment,
    super.mainAxisSize,
    super.crossAxisAlignment,
    super.textDirection,
    super.verticalDirection,
    super.textBaseline,
    super.children,
  }) : super(
    direction: Axis.vertical,
  );
}

2、基本使用

代码示例

Container(
    color: Colors.white,
    child: Column(
        children: [
            Container(color: Colors.red, width: 200, height: 200, child: const Text('Hello World', style: TextStyle(fontSize: 40))),
            Container(color: Colors.blue, width: 150, height: 150, child: const Text('Hello World', style: TextStyle(fontSize: 40))),
            Container(color: Colors.green, width: 200, height: 200, child: const Text('Hello World', style: TextStyle(fontSize: 40))),
        ],
    ),
)

运行结果

image-20230611133320679

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【活动】如何对待工作中的失误

序言 作为一名软件开发程序员,我们每天都面临着无数的挑战和压力。 在这个充满竞争和变化的行业中,难免会犯错。 然而,如何正确地对待和处理这些失误,是必须要学会的重要技能。这不仅仅影响到我们的工作表现,更关乎我…

java SSM 游戏账号租售平台myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 游戏账号租售平台是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

算法刷题-链表-环形链表

找到有没有环已经很不容易了,还要让我找到环的入口? 142.环形链表II 力扣题目链接 题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos 来表示链…

算法刷题-哈希表-有效的字母异位词

有效的字母异位词 242.有效的字母异位词思路其他语言版本相关题目 数组就是简单的哈希表,但是数组的大小可不是无限开辟的 242.有效的字母异位词 力扣题目链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s…

对数据进行模糊匹配搜索(动态规划、最长公共子串、最长公共子序列)

在搜索时常常在输入一半或者输入错误时,搜索引擎就给出智能提示。 已知的搜索推荐主要包括以下几个方面: 包含:“清华” 和 “清华大学”相似:“聊天软件” 和 “通讯软件”相关:“明星” 和 “刘亦菲”纠错&#xff…

Uni-app学习从0到1开发一个app——(4)生命周期

文章目录 0 引入1、应用生命周期2、页面生命周期3、组件生命周期4、引用 0 引入 uin-app生命周期是以小程序的生命周期为基础实现的,分为应用生命周期、页面生命周期、和组件生命周期,其中组件生命周期就是Vue的生命周期。 官方文档可见:ht…

java之反射机制和注解(更新中......)

Reflect在文档中的位置: 文档链接:https://docs.oracle.com/javase/8/docs/api/index.html 用于获取类或对象的反射信息。 常用的反射机制重要的类: java.lang.Class:整个字节码,代表一个类型。包含了以下三块内容&a…

算法刷题-了解哈希表

哈希表 首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。 哈希表是根据关键码的值而直接进行访问的数据结构。 这么这官方的解释…

Spring Boot 基本配置

大家好!我是今越。简单记录一下在 Spring Boot 中的一些基本配置。 Banner 配置 配置文件 application.properties # 设置路径和名称,默认路径名称 resources/banner.txt spring.banner.locationclasspath:banner1.txt # 启动项目时,关闭 b…

语法篇JQuery基础

目录 一、初识JQuery 1.1JQuery介绍 导入方式 常用公式 1.2快速入门 二、JQuery入门 2.1文档就绪函数 2.2名称冲突 2.3JQuery选择器 表单选择器 2.4JQuery过滤器 基础过滤器(Basic Fiter) 子元素过滤器 内容过滤器 可见性过滤器 三、JQuery事件与特效 3.1JQuery…

set/map学习

我们要开始学习map和set的使用,虽然使用更加复杂,但是STL整体的设计,本身就具有很强的前瞻性和延续性,比如说迭代器等,我们顺着文档来看。这也是除了vector之外最重要的容器,当然还有unordered_map 和 unor…

g++ 编译选项

1,基本编译过程 g可以用于编译C代码生成可执行程序,从原始代码到生成可执行过程中实际经历了以下4个步骤: 1. 预处理:宏替换,注释消除,查找相关库文件等[使用-E参数]。 # 只激活预处理,不会自…

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)-附代码

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO) 文章目录 集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 正态云模型2.2 随机反向学习思想2.3 动态扰动策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要: 针对基…

Uni-app学习从0到1开发一个app——(3)简单小工程内容介绍

文章目录 工程文件 看看一个标准的hello微信小程序工程文件的组成和作用。 工程文件 可以参考官方教程:传送门 之前的文章有详细的开发环境介绍,传送门Uni-app学习从0到1开发一个app——(2)windowns环境搭配,这里我们先建一个简单的示例微信…

【工具】Xshell-7和Xftp-7下载安装使用教程

目录 一、Xshell和Xftp 二、安装包下载(Xshell和Xftp) 三、Xshell安装、使用和常用设置 1. Xshell安装: 2. Xshell使用: 3. Xshell常用设置 三、Xftp安装、使用 1. Xftp安装 2. Xftp使用 一、Xshell和Xftp Xshell: Xshell是一款强大的SSH&#xff…

【数据结构与算法分析】树上漫步之探究前序、中序、后序、广度优先遍历算法的实现与优化

文章目录 前言二叉树的遍历方式构建二叉树递归遍历二叉树非递归遍历二叉树层次遍历 示例二叉树结果总结 前言 二叉树是数据结构中最基本的数据结构之一,它在计算机科学中有着非常重要的应用。二叉树的遍历是指按照一定的顺序遍历二叉树中的所有节点,是二…

DML——数据库查询语言

查询——select SELECT [DISTINCT/ALL/] {*|column|expression [alias],…} FROM table [Natuarl join /] where子句; Natuarl join 自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元祖队。 列名(属性名)完成相同值相同去除重复列拓展&…

【Typora+Lsky】在deepin使用YGXB-net/lsky-upload上传图片

本文首发于 慕雪的寒舍 在win和deepin上使用lsky-upload上传图片 1.说明 先前使用lsky图床的时候,我一直用的是picgo的插件来上传图片。 但最近picgo总是遇到卡上传的问题 https://github.com/Molunerfinn/PicGo/issues/1060 后来在gitee上面搜到了这个项目&…

Django实现接口自动化平台(七)数据库设计

上一章: Django实现接口自动化平台(六)httprunner(2.x)基本使用【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章: 一、数据库设计 接口自动化平台,内置引擎,使用的是httprun…

【LeetCode热题100】打卡19天:最大数组和跳跃游戏

文章目录 【LeetCode热题100】打卡第19天:最大数组和&跳跃游戏⛅前言 最大数组和🔒题目🔑题解 跳跃游戏🔒题目🔑题解 【LeetCode热题100】打卡第19天:最大数组和&跳跃游戏 ⛅前言 大家好&#xff…