首页 > 其他分享 >Flutter布局(2):弹性布局(Flex、Expanded)

Flutter布局(2):弹性布局(Flex、Expanded)

时间:2024-10-11 16:01:07浏览次数:9  
标签:Flex Expanded 布局 弹性 组件 Row

一、什么是弹性布局(Flex)

什么是弹性布局(Flex)? 弹性布局(Flex)是一种基于弹性盒子模型的布局方式,类似于 Web 开发中的 Flexbox。在 Flutter 中,Flex 组件是用于实现弹性布局的关键组件之一。Flex 布局是一种简洁且强大的方式,可用于构建水平或垂直方向的弹性布局。

Flex组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方向,使用RowColumn会方便一些,因为RowColumn都继承自Flex,参数基本相同,所以能使用Flex的地方基本上都可以使用RowColumnFlex本身功能是很强大的,它也可以和Expanded组件配合实现弹性布局。

Flex({
  ...
  required this.direction, // 弹性布局的方向, Row默认为水平方向,Column默认为垂直方向
  List<Widget> children = const <Widget>[],
})

二、什么情况下选择Flex比Row和Column更合适

使用场景: 在以下情况下,使用 Flex 布局是更合适的选择,而不使用 Row 和 Column:

  • 不确定子组件数量或尺寸:当子组件的数量或尺寸在运行时动态变化时,使用Flex布局可以更好地适应变化。通过设置弹性因子,可以根据需要自动调整子组件的尺寸比例。

  • 复杂的布局需求:如果需要更复杂的布局结构,涉及多个层次的嵌套和不同方向的排列,使用Flex布局可以提供更大的灵活性。可以通过嵌套多个Flex组件来实现更复杂的布局结构。

  • 自定义子组件尺寸和位置:使用Flex布局可以更灵活地控制子组件的尺寸和位置。通过设置弹性因子、对齐方式和主轴尺寸等属性,可以自定义子组件在布局中的行为。

举例说明: 假设我们有一个水平布局,其中包含两个子组件:一个固定宽度的按钮和一个可伸缩的文本框。当按钮的宽度固定时,我们希望文本框占据剩余的可用空间。

使用 Flex 布局可以轻松实现这个需求:

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
          appBar: AppBar(title: const Text('Progress Indicators')),
          body: Flex(
            direction: Axis.horizontal,
            children: <Widget>[
              ElevatedButton(
                child: const Text('按钮'),
                onPressed: () {},
              ),
              const Expanded(
                child: TextField(
                  decoration: InputDecoration(
                    hintText: '请输入内容',
                  ),
                ),
              ),
            ],
          )),
    ),
  );
}

在这个例子中,我们使用了 Flex 组件和 Expanded 组件来构建弹性布局。ElevatedButton 是一个固定宽度的按钮,而 TextField 通过 Expanded 组件占据剩余的可用空间。效果图如下所示:

Flutter_layoutWidget_L.png


使用 Flex 更佳的场景

还有一些场景,使用 Flex 可能比 Row 和 Column 更佳。

  • 响应式布局:在响应式设计中,屏幕的尺寸和方向可能会发生变化。使用 Flex 布局和 Expanded 组件可以根据可用空间自动调整子组件的尺寸和位置,以适应不同的屏幕尺寸。
  • 列表或网格布局:当需要在列表或网格中显示可变数量的子组件时,使用 Flex 布局和 Expanded 组件可以自动调整子组件的尺寸和布局。例如,一个动态生成的图片网格,每个图片需要根据网格大小进行缩放和布局。
  • 混合布局:有时候我们可能需要在布局中组合使用水平和垂直排列的子组件。使用 Flex 布局和 Expanded 组件,可以创建复杂的混合布局,灵活地组合水平和垂直方向的子组件。
  • 自定义比例布局:有时候我们需要根据设计要求按比例调整子组件的尺寸。使用 Flex 布局和 Expanded 组件,可以设置不同的弹性因子(flex factor),以实现不同子组件之间的尺寸比例。
  • 动画效果: Flex 布局和 Expanded 组件可以与动画结合使用,创建动态变化的布局效果。通过动画来改变子组件的弹性因子、尺寸和位置,可以实现平滑的过渡和动态的布局变化。

三、Expanded组件

Flex 和 Expanded 的感情不得了,比亲儿子还亲。

用 Expanded 组件: Expanded 组件是 Flex 组件的一个特殊情况,它只能作为 Flex 的直接子组件。它可以按比例扩展 Flex 子组件所占用的空间。由于 Row 和 Column 都是 Flex 的子类,所以我们可以在它们内部使用 Expanded 来实现灵活的布局。

下面是一个可直接运行的代码示例,展示了如何使用 Flex、Row和 Expanded 组件构建一个水平方向的弹性布局:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flex布局示例'),
        ),
        body: Flex(
          direction: Axis.horizontal,
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Expanded(
              flex: 1,
              child: Container(
                color: Colors.red,
                height: 100,
              ),
            ),
            Expanded(
              flex: 2,
              child: Container(
                color: Colors.blue,
                height: 100,
              ),
            ),
            Expanded(
              flex: 1,
              child: Container(
                color: Colors.green,
                height: 100,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个例子中,我们创建了一个水平方向的弹性布局,其中使用了三个 Expanded 组件作为子组件。Expanded 组件的弹性因子(flex)分别为 1、2 和 1,使得子组件在可用空间中的比例为 1:2:1。效果图如下所示:

Flutter_layoutWidget_M.png


标签:Flex,Expanded,布局,弹性,组件,Row
From: https://www.cnblogs.com/linuxAndMcu/p/18458612

相关文章

  • Flutter布局(1):线性布局(Row、Column)
    所谓线性布局,即指沿水平或垂直方向排列子组件。Flutter中通过Row和Column来实现线性布局。主轴和纵轴对于线性布局,有主轴和纵轴之分,如果布局是沿水平方向,那么主轴就是指水平方向,而纵轴即垂直方向;如果布局沿垂直方向,那么主轴就是指垂直方向,而纵轴就是水平方向。一、Row组件1.1......
  • Flutter布局(4):层叠布局(Stack、Positioned)
    层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照代码中声明的顺序堆叠起来。Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠,而Positioned用于根据......
  • Flutter布局(3):流式布局(Wrap、Flow)
    一、简介在Flutter中,流式布局是一种常用的布局方式,用于实现动态调整子组件位置和尺寸的需求。Flutter提供了两个流式布局的组件:Wrap和Flow。其实,Flow用的实在不多呀。二、Wrap组件Wrap组件是一种流式布局,它会自动调整和换行子组件,以适应可用空间。属性Wrap组件具有......
  • Flutter布局(5):对齐与居中布局(Align、Center)
    在Flutter中,布局是构建用户界面的重要组成部分。Align和Center是两个常用的布局组件,它们都用于在父组件中对子组件进行对齐和居中。本篇博客将详细介绍Align和Center的用法、属性和适用场景,帮助你更好地理解和运用它们。一、Align:精准对齐,掌握位置Align组件用于将子组......
  • CSS布局
    1.CSS中包含以下定位机制(1)普通流。每个块级元素都换行显示。(2)相对定位。将一个元素从普通流所处的位置上移动。这种移动不会影响周围元素的位置。(3)绝对定位。绝对定位的元素的位置相对于包含他的元素。完全脱离了普通流。不会影响到周围任何元素的位置。使用绝对定位的元素随......
  • Flexbox弹性盒子详解
    弹性盒子模型详解Flex弹性盒子模型详解Flex布局的基本概念Flex布局的常见属性及用法1.主轴方向2.主轴换行方式3.flex-flow(分开写更好)4.主轴对齐方式5.侧轴对齐方式5.1一行的情况5.2多行的情况6.伸缩性6.1flex-basis6.2flex-grow(伸)6.3flex-shrink(缩)7.flex复......
  • WPF 等距布局
    本文告诉大家如何使用WPF的自定义布局做等距布局实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于StackPanel的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。......
  • JVM系列(四) -内存布局详解
    一、摘要熟悉Java语言特性的同学都知道,相比C、C++等编程语言,Java无需通过手动方式回收内存,内存中所有的对象都可以交给Java虚拟机来帮助自动回收;而像C、C++等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java应用程序......
  • CSS Flex 布局教程
    简介弹性盒子是CSS3的一种新的布局模式。CSS3弹性盒(FlexibleBox或flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白......
  • 仓库布局对拣选效率的影响
    根据国外研究,拣货过程中最耗时的部分是移动,平均占用拣货人员的55%的时间,其次是纸质单据填写和其他活动(20%)、查找货物(15%)和搬运货物(10%)。出于这个原因,围绕改进拣货流程的大部分工作是在减少查找货物及移动时间。精明的仓库管理者利用80/20规则来提高拣货效率。既20%的产品......