【flutter】Expanded组件

本文深入解析了Flutter框架中Expanded组件的功能与用法,通过多个示例展示了如何使用Expanded组件来动态调整child组件沿主轴的尺寸,实现如填充剩余空间、设置尺寸比例等布局效果。

Expanded组件是flutter中使用率很高的一个组件,它可以动态调整child组件沿主轴的尺寸,比如填充剩余空间,比如设置尺寸比例。它常常和Row或Column组合起来使用。

构造函数

const Expanded(
{
   
   Key key,
int flex: 1,
@required Widget child}
)

它除了child之外,有一个flex属性比较常用。flex表示弹性系数,默认是1。

下面结合Row来实验Expanded的用法。

示例一:当Row中的组件不使用Expanded的时候

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
    home: Scaffold(
        appBar: AppBar(title: Text("Row demo")),
        body: Container(
            color: Colors.green,
            child: Row(children: <Widget>[
              Image.asset(
                "graphyics/face.jpg",
                width: 100,
                height: 100,
                fit: BoxFit.cover,
              ),
              Image.asset(
                "graphyics/face.jpg",
                width: 100,
                height: 100,
                fit: BoxFit.cover,
              ),
              Image
<think>我们正在讨论Flutter中的Expanded和Flexible组件。根据引用内容,我们可以总结如下: 1. **Flexible组件**: - 用于控制Row、Column、Flex等布局中的子组件如何分配可用空间。 - 有两个重要属性: - `flex`:弹性系数,用于设置子组件在剩余空间中所占的比例(默认为1)。 - `fit`:填充方式,有两种取值: - `FlexFit.loose`:子组件可以占用剩余空间,但不强制填满(默认值)。 - `FlexFit.tight`:强制子组件填满剩余空间。 2. **Expanded组件**: - 是Flexible的子类,相当于一个特定配置的Flexible。 - 它固定了`fit`属性为`FlexFit.tight`,即强制子组件填满剩余空间。 - 同样具有`flex`属性,用于设置空间占比。 **主要区别**: - `Expanded` 是 `Flexible` 的一个特例,它强制子组件填满剩余空间(`fit: FlexFit.tight`)。 - `Flexible` 默认情况下(`fit: FlexFit.loose`)允许子组件占用剩余空间但不强制填满,即子组件可以小于分配的空间。 **使用场景**: - 当需要子组件充满剩余空间时,使用`Expanded`。 - 当需要子组件可以占用剩余空间但不必填满(例如,子组件有固定大小或最大尺寸限制)时,使用`Flexible`并设置`fit: FlexFit.loose`。 **示例**: ```dart Row( children: [ Container(width: 50, height: 50, color: Colors.red), // 使用Expanded,子组件(蓝色容器)将填满剩余宽度 Expanded( flex: 1, // 弹性系数,默认1 child: Container(height: 50, color: Colors.blue), ), // 使用Flexible,子组件(绿色容器)可以占用剩余空间但不强制填满,这里设置最大宽度为100 Flexible( fit: FlexFit.loose, // 默认值,可省略 child: Container( height: 50, width: 100, // 有固定宽度,所以不会填满剩余空间 color: Colors.green, ), ), ], ) ``` 在这个例子中: - 红色容器固定宽度50。 - 蓝色容器(Expanded)会填满剩余空间(减去绿色容器占用的部分)。 - 绿色容器(Flexible)虽然被分配了剩余空间(因为flex默认为1),但由于设置了固定宽度100,所以它只占用100的宽度,而不会强制填满。 **注意**:如果多个Expanded或Flexible组件并列,它们将按照flex比例分配剩余空间。 **引用说明**: - 引用[1]和[2]指出Expanded继承自Flexible,且固定fit为tight[^1][^2]。 - 引用[3]说明Expanded通过flex属性调整填充比例[^3]。 - 引用[4]提到Flexible作用于单个子项的布局[^4]。 - 引用[5]展示了Expanded的构造函数[^5]。 §§相关问题§§ 1. 在Flutter中,如何实现多个Expanded组件按比例分配空间? 2. 使用Flexible组件时,如何设置子组件的最大尺寸? 3. Flutter布局中,Spacer组件Expanded组件有什么关系?</think>### Flutter 中 `Expanded` 与 `Flexible` 组件的区别 在 Flutter 布局系统中,`Expanded` 和 `Flexible` 都是用于控制子组件在 `Row`、`Column` 或 `Flex` 中空间分配的组件,但存在关键差异: | **特性** | `Expanded` 组件 | `Flexible` 组件 | |------------------|------------------------------------------|------------------------------------------| | **继承关系** | 继承自 `Flexible` | 基础组件 | | **fit 属性** | 固定为 `FlexFit.tight`(强制填满空间)[^1][^5] | 可配置为 `FlexFit.tight` 或 `FlexFit.loose` | | **空间填充行为** | **必须填满**剩余空间 | **可自由控制**是否填满剩余空间 | | **flex 属性** | 支持设置空间分配比例 | 支持设置空间分配比例 | | **适用场景** | 需要子组件强制填满剩余空间 | 需要灵活控制子组件空间占用 | --- ### 核心区别详解 #### 1. **空间填充行为** ```dart Row( children: [ // Flexible - 不强制填满空间 Flexible( fit: FlexFit.loose, // 默认值 child: Container(width: 50), // 宽度可小于分配空间 ), // Expanded - 强制填满空间 Expanded( child: Container(), // 自动填满剩余宽度 ), ], ) ``` - `Expanded` 的子组件**必须填满**分配的空间(类似 CSS 的 `flex-grow: 1`) - `Flexible` 默认允许子组件**小于分配空间**(通过 `fit: FlexFit.loose`) #### 2. **fit 属性配置** ```dart Flexible( fit: FlexFit.tight, // 此时行为等同于 Expanded child: Container(), ) Flexible( fit: FlexFit.loose, // 子组件可不填满空间 child: Container(width: 100), ) ``` - `Flexible` 的 `fit` 参数提供更灵活的空间控制能力[^4] - `Expanded` 本质是 `fit: FlexFit.tight` 的语法糖[^5] #### 3. **flex 空间分配比例** ```dart Row( children: [ Expanded(flex: 2, child: Container()), // 占2/3空间 Expanded(flex: 1, child: Container()), // 占1/3空间 ], ) ``` - 两者都支持 `flex` 参数按比例分配空间[^3] - 比例计算公式:`子组件宽度 = (flex值/总flex值) * 剩余空间` --- ### 何时选择使用? | **场景** | **推荐组件** | |-----------------------------------|-------------| | 需要子组件强制填满剩余空间 | `Expanded` | | 需要控制子组件是否填满空间 | `Flexible` | | 按比例分配空间的固定填充 | `Expanded` | | 子组件有最大/最小尺寸限制 | `Flexible` | > **关键结论**: > `Expanded` = `Flexible` + `fit: FlexFit.tight`[^1][^5] > 当需要强制填满空间时用 `Expanded`,需要灵活控制时用 `Flexible` --- ### 完整示例 ```dart Row( children: [ // 固定宽度组件 Container(width: 80, color: Colors.red), // Flexible - 不强制填满 Flexible( fit: FlexFit.loose, child: Container( color: Colors.green, height: 50, width: 50, // 实际宽度50 < 分配空间 ), ), // Expanded - 强制填满剩余空间 Expanded( flex: 2, // 占比2/3 child: Container(color: Colors.blue), ), // 等效的Flexible实现 Flexible( flex: 1, // 占比1/3 fit: FlexFit.tight, // 强制填满 child: Container(color: Colors.yellow), ), ], ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值