【Flutter 2-9】Flutter手把手教程UI布局和Widget——弹性布局控件Flexible

2023-10-27

作者 | 弗拉德
来源 | 弗拉德(公众号:fulade_me)

Flexible

Flexible可以帮助Row、Column、Flex的子控件充满父控件,它的用法很灵活,也具有权重的属性。跟Flexible相类似的控件还有Expanded。
先来看Flexible的构造函数

const Flexible({
    /// key
    Key key,
    // 默认 flex 的值为 1
    this.flex = 1,
    /// 默认 fit参数为 FlexFit.loose 表示子控件可以以最小的大小来布局
    this.fit = FlexFit.loose,
    @required Widget child,
}) 

按比例布局

Flexible的参数flex是表示比例的值。
假如我们在Column内部有三个子控件,每个控件的flex值都设置为1
那么这三个子控件的高度都是Column高度(Row的情况下就是宽度)的三分之一,也就是三个子控件均分了Column的高度(Row的情况下就是宽度)

Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
    ],
)

如下图:
2020_01_14_flexible_1_1_1

然后我们把flex的值分别设置为123,那么这个三个控件的高度分别是五分之一、五分之二、五分之三的高度

Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 3,
        ),
    ],
)

效果如下图:
2020_01_14_flexible_1_2_3

FlexFit.loose 和 FlexFit.tight

枚举值 描述
loose loose表示允许以最小的高度(Row下是宽度)布局 可以忽略flex的值
tight 必须以设置的最大的flex值来显示
Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset(
            "images/image_demo.jpg",
            height: 80,
            ),
            fit: FlexFit.loose,
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
    ],
)

我们给第二个控件设置的flex值为2,给Image设置的高度为80,给fit的值设置为FlexFit.loose,这个时候优先起到作用的是FlexFit.looseflex的值会被忽略,所以这里的Image会以高度为80的大小来显示。
效果如下图:
2020_01_14_flexible_loose

Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset(
            "images/image_demo.jpg",
            height: 80,
            ),
            fit: FlexFit.tight,
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
    ],
)

我们把FlexFit.loose改为FlexFit.tight,此时就会忽略当前设置的高度80,直接使用比例来显示。
效果如下图:
2020_01_14_flexible_tight

优先布局

如果我们将flex的值设置为0,此时Flexible并不是被分配0的高度,而是flex值为0的Flexible会优先布局且会尽量大的占用Column的高度

Column(
    children: [
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 1,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 2,
        ),
        Flexible(
            child: Image.asset("images/image_demo.jpg"),
            flex: 0,
        ),
    ],
)

2020_01_14_flexible_flex_00
可以看到第三个Flexible是高度最大的,因为它优先占用最高的高度。

填充剩余的空间

很多情况下在Column内不止是有Flexible控件,还有像Container这种控件。在二者都存在的情况下,Container会优先布局并占用自己需要的高度,剩余的高度由Flexible控件来填充满。如果有多个Flexible控件,它们会按自己设置的flex值来均分剩余的高度。

Column(
    children: [
        Container(
            child: Image.asset("images/image_demo.jpg"),
            width: 100,
            height: 100,
        ),
        Container(
            child: Image.asset("images/image_demo.jpg"),
            width: 100,
            height: 100,
        ),
        Flexible(
            child: Container(
                decoration: BoxDecoration(color: Colors.green),
                width: 300,
            ),
        ),
    ],
)

效果如下:
2020_01_14_flexible_flex_space_full

想体验以上示例的运行效果,可以到我的Github仓库项目flutter_app->lib->routes->flexible_page.dart查看,并且可以下载下来运行并体验。


公众号

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

【Flutter 2-9】Flutter手把手教程UI布局和Widget——弹性布局控件Flexible 的相关文章

随机推荐

  • 强化学习 OpenAI Gym Universe Docker在Windows WSL 2安装配置最全的全记录

    1 事情的起源 全记录事情的起源是为了学习Python强化学习实战 先在自己的windows操作系统的Pycharm Anaconda Gym配置下运行成功了CartPole示例和CarRacing示例 接着运行Universe 据说Ope
  • JVM 与 GC 讲解

    文章目录 一 概述 二 JVM 内存模型 三 GC算法和回收器 1 垃圾回收算法 2 垃圾回收器 四 垃圾回收机制 GC 1 分代垃圾回收机制 2 G1 垃圾回收器 3 FullGC 机制 一 概述 JVM Java Virtual Mac
  • Retrofit2+Rxjava2+Rxandroid+okhttp3+Lifecycle 的MVP网络框架,精简Google官方AAC框架,实现APP生命周期的管理

    一 介绍 目前使用较为广泛的网络请求框架 MVP Retrofit2 okhttp3 Rxjava2 我于2017年也加入了使用行列 在网上找了许多案例 实际项目开发中解决了一些所谓的坑 总结了些内容与大家共享一下 1 什么是MVP 在图中
  • 优惠价,百分比计算,折扣计算,打折计算

    一 优惠价 百分比计算 例如 原价是100元 优惠5 5 5 100 0 05 优惠价 100x5 100x0 05 5 计算得出优惠价是5元 优惠后的价格 原价 优惠价 95 100 5 计算得出优惠后的价格是95元 例如 原价是100元
  • 理解DDoS防护本质:基于资源较量和规则过滤的智能化系统

    本文由 网易云 发布 随着互联网生态逐渐形成 DDoS防护已经成为互联网企业的刚需要求 网易云安全 易盾 工程师根据DDoS的方方面面 全面总结DDoS的攻防对抗 1 什么是DDoS DDoS全称Distributed Denial of
  • steam deck科普、上手教程及模拟器配置指南

    steam deck 前言 早在2021年得时候 坊间就开始流传steam deck这个东西要问世了 但是中途跳了几次票 直到2022年2月 第一批steam deck才正式面向大众玩家 在熟悉steam deck之前 我们有必要了解如下的
  • VS2019 + libcurl5.7.0 + openssl3.0.5 简易编译教程

    VS2019 libcurl5 7 0 openssl编译配置 1 用途 工作用到C 对求高德地图发送https请求 进行逆地址分析 2 文件包下载 2 1 window的openssl3 0 5EXE安装包 链接 exe安装包 2 2 下
  • numpy求平均值

    本文转自链接 https www cnblogs com yibeimingyue p 11413295 html 1 对数组求平均值 import numpy as np a np array 1 2 3 4 print a print
  • C语言问题汇总

    C语言问题汇总 排序方法 冒泡排序 降序排序 作业 从文件中读取内容 字符写入文件 结构体数组 以二进制形式写入文件并读取 将字符串写入文件 并从文件中读取 查找字符在字符串中的位置 字符串链接 不使用strcpy函数 使用strcpy函数
  • 俄罗斯方块C++代码(转载他人代码)

    include
  • (ctf)攻防世界web模块020web2

    题目 首先来到给定的地址 题意很明确 miwen是加密之后的字符串 我们只需要逆向解密出miwen就能得到flag 我们先来代码审计 o strrev str strrev 函数是字符串的倒置 for 0 0 0
  • java.io.IOException: Connection reset by peer问题解决

    java io IOException Connection reset by peer问题解决 今天检查日志 发现 ClientAbortException java io IOException Connection reset by
  • font-spider(字蛛)的正确打开方式

    前言 最近在部署vue项目之后 在打开网页的时候 ttf文件下载时间实在是太久了 在经过合理的运用搜索引擎之后 可能自己的固化思维消化不了大佬们给出的方案 于是在他们的基础之上做了一些小小的改动 便叙文记之 1 引入font spider的
  • BigDecimal 前端丢失精度的问题解决

    问题描述 后端数字是85 00 但是前端显示85 SQL语句 select cast 字段 as decimal 10 2 value 这里已经保留两位小数了 from table where 实体类 这里是关键 注意不是 JSONFiel
  • java 的JDBC操作

    JDBC java数据库连接 提供了一套数据库操作标准 这些标准需要各个数据库厂商去实现并提供一个驱动程序 目前常见的4类JDBC驱动程序 JDBC ODBC 直接利用微软的ODBC进行数据库连接操作 性能低 一般不推荐 JDBC本地驱动
  • 前端笔记

    发布在github的笔记 下载慢 所以我放到csdn上面了 源地址 https github com overcomputer JavaScript 源地址 关注 大佬发布在github的笔记 下载慢 所以我放到csdn上面了 源地址 ht
  • Android HandlerThread 总结使用

    前言 以前我在 Android Handler Loop 的简单使用 介绍了子线程和子线程之间的通信 很明显的一点就是 我们要在子线程中调用Looper prepare 为一个线程开启一个消息循环 默认情况下Android中新诞生的线程是没
  • 一招教你学会使用AD更改PCB板子尺寸

    使用原理图生成PCB后 Altium Designer会根据原理图大小自动生成一块黑色区域 还有一个在禁止布线层的方框 还有两段标注板子大小的线 下面说一下如何更改黑色区域的大小 还有如何精确确定板子尺寸 比如使其为长宽都为整数 1 调整
  • 【浙工商期末报告】研一R语言期末作业(源代码分享)

    目录 研一R语言期末作业 源代码分享 一 作业回顾 1 1 计算t值 1 2 绘图 二 结果展示 2 1 计算t值 2 2 绘图 三 源代码分享 一 作业回顾 1 1 计算t值 1 2 绘图 二 结果展示 2 1 计算t值 1 1 9379
  • 【Flutter 2-9】Flutter手把手教程UI布局和Widget——弹性布局控件Flexible

    作者 弗拉德 来源 弗拉德 公众号 fulade me Flexible Flexible可以帮助Row Column Flex的子控件充满父控件 它的用法很灵活 也具有权重的属性 跟Flexible相类似的控件还有Expanded 先来看