Flutter中Expanded与Flexible的区别?

发布于 1周前 作者 vueper 来自 Flutter

Flutter中Expanded与Flexible的区别?

在 Flutter 中,ExpandedFlexible 都是用于在 RowColumn 等布局中按比例分配空间的组件。虽然它们有相似之处,但有一些关键区别。

1. 基本作用

  • Flexible

    • 可以根据剩余空间大小来调整自身的大小,但不会强制填满剩余空间。
  • Expanded

    • Flexible 的子类,且 flex 参数默认为 1,它会强制子组件填满所有剩余空间。

2. flex 参数

  • Flexible

    • 可以设置 flex 参数,指定子组件占用的比例。
    • Flexible 不会强制填满空间,而是允许子组件根据自己的内容尺寸和比例灵活调整。
  • Expanded

    • 继承了 Flexible 并且默认 flex 值为 1。
    • 所以 Expanded 始终填满剩余空间,除非 flex 被设置为 0。

3. 使用方式

  • Flexible

    • 适合在需要按比例调整子组件大小,但允许它们根据内容大小有所变化的场景。
    • 例如,某些组件占据一部分剩余空间,但不填满整个区域。
  • Expanded

    • 适合在需要填满所有剩余空间的情况下使用,通常用于填充布局中的剩余区域。

示例对比

Flexible 示例

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flexible Example'),
        ),
        body: Row(
          children: [
            Flexible(
              flex: 2,
              child: Container(
                color: Colors.red,
                child: Center(child: Text('Red Container')),
              ),
            ),
            Flexible(
              flex: 1,
              child: Container(
                color: Colors.blue,
                child: Center(child: Text('Blue Container')),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中,两个 Flexible 子组件按比例分配剩余空间,但会根据内容自适应。红色容器占 2/3 的剩余空间,蓝色容器占 1/3 的空间。

Expanded 示例

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Expanded Example'),
        ),
        body: Row(
          children: [
            Expanded(
              child: Container(
                color: Colors.red,
                child: Center(child: Text('Red Container')),
              ),
            ),
            Expanded(
              child: Container(
                color: Colors.blue,
                child: Center(child: Text('Blue Container')),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中,Expanded 会强制填满剩余空间。红色和蓝色容器各自占 50% 的空间,因为 Expanded 强制填满所有可用的空间。

4. 适用场景

  • Flexible

    • 适合需要按比例分配空间,但允许子组件根据内容大小灵活调整时使用。
  • Expanded

    • 适合需要占据整个剩余空间的场景,比如一个内容区域需要填充整个可用空间。

总结特性

特性 Flexible Expanded
是否填满剩余空间 否,可根据内容大小调整 是,强制填满剩余空间
默认 flex 值 必须手动设置 默认 1
适用场景 按比例分配空间并根据内容自适应 填充布局中的剩余空间

通常在需要填满剩余空间的情况时使用 Expanded,而在需要按比例分配空间但保留内容灵活性时使用 Flexible


更多关于Flutter中Expanded与Flexible的区别?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter中Expanded与Flexible的区别?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,ExpandedFlexible 都是用于在 ColumnRow 布局中分配子组件的空间,但它们在工作原理和适用场景上有所不同。下面将通过代码示例来详细解释它们的区别。

Expanded

Expanded 强制其子组件扩展以填充父容器中的剩余空间。在 ColumnRow 中使用 Expanded 时,它会确保子组件占据所有可用空间,并且通常会等比例分配(如果多个 Expanded 并存)。

示例代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Expanded Example'),
        ),
        body: Column(
          children: <Widget>[
            Expanded(
              child: Container(
                color: Colors.red,
                child: Center(child: Text('Expanded 1')),
              ),
            ),
            Expanded(
              child: Container(
                color: Colors.blue,
                child: Center(child: Text('Expanded 2')),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中,两个 Expanded 组件会平分整个 Column 的高度。

Flexible

Flexible 允许其子组件根据给定的 flex 值来分配空间。默认情况下,flex 值是 1,这意味着如果多个 Flexible 组件具有相同的 flex 值,它们将等比例分配空间。但是,你可以通过修改 flex 值来调整每个 Flexible 组件所占的空间比例。

示例代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flexible Example'),
        ),
        body: Column(
          children: <Widget>[
            Flexible(
              flex: 1,
              child: Container(
                color: Colors.green,
                child: Center(child: Text('Flexible 1')),
              ),
            ),
            Flexible(
              flex: 2,
              child: Container(
                color: Colors.yellow,
                child: Center(child: Text('Flexible 2')),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中,Flexible 1Flexible 2 将会按照 1:2 的比例分配 Column 的高度。即 Flexible 2 将占据的空间是 Flexible 1 的两倍。

总结

  • Expanded 强制其子组件扩展以填充父容器的剩余空间,且等比例分配(如果多个 Expanded 并存)。
  • Flexible 允许通过 flex 值来更灵活地分配空间,可以调整每个子组件所占的空间比例。

在实际开发中,如果希望所有子组件等比例分配空间,可以使用 Expanded。如果需要更细粒度的控制,则 Flexible 更为合适。选择哪个组件取决于具体的需求和布局要求。

回到顶部