Flutter Expanded 与 Flexible 详解

目录

[1. 引言](#1. 引言)

[2. Expanded 的基本用法](#2. Expanded 的基本用法)

[3. Flexible 的基本用法](#3. Flexible 的基本用法)

[4. Expanded vs Flexible 的区别](#4. Expanded vs Flexible 的区别)

[4.1 基础定义](#4.1 基础定义)

[4.2 关键差异](#4.2 关键差异)

[5. Expanded 深度解析](#5. Expanded 深度解析)

[5.1 按比例分配](#5.1 按比例分配)

[5.2 强制填充特性](#5.2 强制填充特性)

[6. Flexible 深度解析](#6. Flexible 深度解析)

[6.1 基础用法:动态收缩](#6.1 基础用法:动态收缩)

[6.2 结合 fit 参数控制填充方式](#6.2 结合 fit 参数控制填充方式)

[7. 实战场景对比](#7. 实战场景对比)

[场景1:导航栏布局(Expanded 更合适)](#场景1:导航栏布局(Expanded 更合适))

[场景2:图文混排(Flexible 更合适)](#场景2:图文混排(Flexible 更合适))

[8. 结论](#8. 结论)

相关推荐


1. 引言

在 Flutter 布局系统中,ExpandedFlexible 组件用于在 RowColumn 等布局中控制子组件的弹性伸缩。它们可以合理分配可用空间,使 UI 布局更加灵活。本文将介绍 ExpandedFlexible 的用法、区别及适用场景。

2. Expanded 的基本用法

Expanded 组件用于填充 RowColumn 的剩余空间,且多个 Expanded 组件会按照 flex 权重平分可用空间。

Dart 复制代码
Row(
  children: [
    Expanded(
      child: Container(color: Colors.blue, height: 50),
    ),
    Expanded(
      child: Container(color: Colors.red, height: 50),
    ),
  ],
)

在上述代码中,两个 Expanded 组件将均分 Row 的可用宽度,如下图所示:

3. Flexible 的基本用法

Flexible 组件类似于 Expanded,但它允许子组件根据自身内容决定是否占据所有可用空间。

Dart 复制代码
Row(
  children: [
    Flexible(
      child: Container(color: Colors.green, height: 50),
    ),
    Flexible(
      child: Container(color: Colors.orange, height: 50),
    ),
  ],
)

如果子组件的内容不需要占满整个空间,Flexible 允许它保持原尺寸,而 Expanded 会强制填充可用空间。

4. Expanded vs Flexible 的区别

4.1 基础定义

组件 作用 适用场景
Expanded 强制填充父容器剩余空间 需要均分可用空间
Flexible 允许子组件决定是否填充空间 适用于自适应布局

4.2 关键差异

特性 Expanded Flexible
空间填充方式 必须填满剩余空间(强制拉伸) 可按比例分配,允许不填满剩余空间
布局约束 子组件尺寸被忽略,强制占满分配空间 子组件尺寸可影响实际占用空间
典型场景 等分剩余空间、固定比例布局 动态调整子组件尺寸、部分填充空

5. Expanded 深度解析

5.1 按比例分配

Dart 复制代码
Row(
  children: [
    Expanded(
      flex: 2, // 占2/5
      child: Container(height: 50, color: Colors.amber),
    ),
    Expanded(
      flex: 3, // 占3/5
      child: Container(height: 50, color: Colors.purple),
    ),
  ],
)

5.2 强制填充特性

当子组件有固定尺寸时,Expanded 会忽略子组件尺寸,强制拉伸:

Dart 复制代码
Row(
  children: [
    Expanded( // 忽略 width: 50,占满剩余空间
      child: Container(width: 50, color: Colors.red),
    ),
    Container(width: 100, color: Colors.blue),
  ],
)

6. Flexible 深度解析

6.1 基础用法:动态收缩

Dart 复制代码
Row(
  children: [
    Flexible( // 允许不填满剩余空间
      child: Container(
        color: Colors.green,
        child: Text('自适应文本'), // 文本长度决定宽度
      ),
    ),
    Container(width: 100, color: Colors.blue),
  ],
)

6.2 结合 fit 参数控制填充方式

Dart 复制代码
Row(
  children: [
    Flexible(
      fit: FlexFit.tight, // 行为类似 Expanded
      child: Container(color: Colors.red),
    ),
    Flexible(
      fit: FlexFit.loose, // 根据子组件尺寸调整
      child: Container(width: 80, color: Colors.blue),
    ),
  ],
)

7. 实战场景对比

场景1:导航栏布局(Expanded 更合适)

Dart 复制代码
AppBar(
  title: Row(
    children: [
      Expanded( // 标题居中
        child: Center(
          child: Text('首页'),
        ),
      ),
      IconButton(icon: Icon(Icons.search), onPressed: () {}),
    ],
  ),
)

场景2:图文混排(Flexible 更合适)

Dart 复制代码
Row(
  children: [
    Flexible(
      child: Text('这是一个可能很长的文本内容,需要根据剩余空间自动换行...'),
    ),
    SizedBox(width: 16),
    Image.asset('assets/icon.png', width: 80),
  ],
)

8. 结论

ExpandedFlexible 是 Flutter 中用于控制弹性布局的重要组件。Expanded 强制填充空间,而 Flexible 允许子组件决定是否扩展。理解它们的差异并结合 flex 参数,可以更高效地实现响应式 UI 布局。

相关推荐

Flutter Stack 组件详解-CSDN博客文章浏览阅读1.9k次,点赞27次,收藏39次。Stack 是一个用于层叠布局的组件,允许多个子组件按照 Z 轴(深度方向)进行排列。Stack 适用于构建重叠 UI,如头像叠加、卡片阴影、引导页等。本文将介绍 Stack 的基本用法、主要属性及常见的自定义技巧。https://shuaici.blog.csdn.net/article/details/146070133Flutter PopupMenuButton 详解-CSDN博客文章浏览阅读1.9k次,点赞69次,收藏60次。PopupMenuButton 是一个用于创建弹出菜单的组件,适用于提供上下文操作、设置选项等功能。用户点击按钮后,会弹出一个菜单列表,供用户选择。本文将介绍 PopupMenuButton 的基本用法、主要属性及自定义样式。_flutter popupmenubuttonhttps://shuaici.blog.csdn.net/article/details/146069960

相关推荐
JavinLu44 分钟前
ios 配置了代理且使用 chls.pro/ssl 下载不了证书,无法弹出下载证书的提示问题
网络协议·ios·ssl
晚霞的不甘1 小时前
Flutter for OpenHarmony 实现计算几何:Graham Scan 凸包算法的可视化演示
人工智能·算法·flutter·架构·开源·音视频
独行soc1 小时前
2026年渗透测试面试题总结-19(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
千逐681 小时前
气象流体场:基于 Flutter for OpenHarmony 的实时天气流体动力学可视化系统
flutter
一只大侠的侠1 小时前
Flutter开源鸿蒙跨平台训练营 Day12从零开发通用型登录页面
flutter·开源·harmonyos
晚霞的不甘1 小时前
Flutter for OpenHarmony天气卡片应用:用枚举与动画打造沉浸式多城市天气浏览体验
前端·flutter·云原生·前端框架
子春一2 小时前
Flutter for OpenHarmony:语桥 - 基于Flutter的离线多语言短语速查工具实现与国际化设计理念
flutter
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day 15React Native Formik 表单实战
flutter·开源·harmonyos
说私域2 小时前
日本零售精髓赋能下 链动2+1模式驱动新零售本质回归与发展格局研究
人工智能·小程序·数据挖掘·回归·流量运营·零售·私域运营
G31135422732 小时前
免费苹果 Plist 文件在线制作 iOS IPA 安装工具
ios