首页 > 其他分享 >Flutter布局(3):流式布局(Wrap、Flow)

Flutter布局(3):流式布局(Wrap、Flow)

时间:2024-10-11 16:00:09浏览次数:7  
标签:const 布局 Flow 组件 Wrap margin

一、简介

在 Flutter 中,流式布局是一种常用的布局方式,用于实现动态调整子组件位置和尺寸的需求。

Flutter 提供了两个流式布局的组件:WrapFlow

其实,Flow 用的实在不多呀。

二、Wrap组件

Wrap 组件是一种流式布局,它会自动调整和换行子组件,以适应可用空间。

属性

Wrap 组件具有以下常见属性:

  • direction(方向):指定子组件的排列方向,可以是水平(Axis.horizontal)或垂直(Axis.vertical)方向。
  • alignment(对齐方式):指定子组件在主轴上的对齐方式。
  • spacing(主轴间距):指定子组件在主轴上的间距。
  • runSpacing(交叉轴间距):指定子组件在交叉轴上的间距。

Wrap 使用场景

  • 动态排列:当子组件的数量不确定或需要动态添加时,使用Wrap可以自动调整子组件的位置和尺寸,以适应可用空间。
  • 标签布局:在实现标签云、标签选择器等场景时,Wrap组件非常有用。子组件可以根据可用空间自动换行,并根据内容自适应尺寸。

下面是一个可运行的示例代码,展示了 Wrap 组件的基本用法:

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('Wrap布局示例'),
        ),
        body: const Wrap(
          direction: Axis.horizontal,
          alignment: WrapAlignment.start,
          spacing: 8.0,
          runSpacing: 8.0,
          children: <Widget>[
            Chip(
              label: Text('标签1'),
              backgroundColor: Colors.blue,
            ),
            Chip(
              label: Text('标签2'),
              backgroundColor: Colors.green,
            ),
            Chip(
              label: Text('标签3'),
              backgroundColor: Colors.red,
            ),
            // 更多子组件...
          ],
        ),
      ),
    );
  }
}

在这个例子中,Wrap 组件包含了一些 Chip 组件作为子组件。Wrap 的属性设置了子组件的排列方向、对齐方式以及主轴和交叉轴的间距。效果图如下所示:

Flutter_layoutWidget_N.png


三、Flow组件

属性

Flow 组件也是一种流式布局,它与 Wrap 不同的是,Flow 可以更精确地控制子组件的位置。Flow 组件具有以下常见属性:

  • delegate(委托):FlowDelegate 对象,用于控制子组件的位置和尺寸。

Flow使用场景

Flow 组件在开发中常用于以下场景:

  1. 自定义布局:当需要自定义子组件的位置时,可以使用 Flow 组件。通过自定义 FlowDelegate 对象,可以实现灵活的布局算法。
  2. 复杂布局:在一些复杂的布局需求中,Flow 可以提供更精确的控制,例如创建非线性的子组件排列方式。

下面是一个可运行的示例代码,展示了 Flow 组件的基本用法:

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('Flow布局示例'),
        ),
        body: Flow(
          delegate: FlowChildrenDelegate(
            margin: const EdgeInsets.all(10.0),
          ),
          children: <Widget>[
            Container(width: 80.0, height: 80.0, color: Colors.red),
            Container(width: 120.0, height: 80.0, color: Colors.green),
            Container(width: 100.0, height: 100.0, color: Colors.blue),
            // 更多子组件...
          ],
        ),
      ),
    );
  }
}

class FlowChildrenDelegate extends FlowDelegate {
  final EdgeInsets margin;

  FlowChildrenDelegate({required this.margin});

  @override
  void paintChildren(FlowPaintingContext context) {
    for (int i = 0; i < context.childCount; i++) {
      context.paintChild(
        i,
        transform: Matrix4.translationValues(
          margin.left + (i % 3) * (80.0 + margin.left + margin.right),
          margin.top + (i ~/ 3) * (80.0 + margin.top + margin.bottom),
          0.0,
        ),
      );
    }
  }

  @override
  bool shouldRepaint(covariant FlowDelegate oldDelegate) {
    return true;
  }
}

在这个例子中,Flow 组件包含了一些 Container 组件作为子组件。Flow 的 delegate 属性使用了自定义的 FlowDelegate 对象来控制子组件的位置和尺寸。

看起来,是复杂了点。实际使用频率也不是很高。

效果图如下所示:

Flutter_layoutWidget_O.png


四、总结

Wrap 和 Flow 是 Flutter 中常用的流式布局组件,它们可以帮助我们实现动态调整子组件位置和尺寸的需求。Wrap 适用于自动换行和自适应尺寸的场景,而 Flow 适用于更精确控制子组件位置的场景。


标签:const,布局,Flow,组件,Wrap,margin
From: https://www.cnblogs.com/linuxAndMcu/p/18458613

相关文章

  • Flutter布局(5):对齐与居中布局(Align、Center)
    在Flutter中,布局是构建用户界面的重要组成部分。Align和Center是两个常用的布局组件,它们都用于在父组件中对子组件进行对齐和居中。本篇博客将详细介绍Align和Center的用法、属性和适用场景,帮助你更好地理解和运用它们。一、Align:精准对齐,掌握位置Align组件用于将子组......
  • Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)
    关于深度实战社区我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。社区特色:深度实战算法创新获取全部完整项目......
  • CSS布局
    1.CSS中包含以下定位机制(1)普通流。每个块级元素都换行显示。(2)相对定位。将一个元素从普通流所处的位置上移动。这种移动不会影响周围元素的位置。(3)绝对定位。绝对定位的元素的位置相对于包含他的元素。完全脱离了普通流。不会影响到周围任何元素的位置。使用绝对定位的元素随......
  • WPF 等距布局
    本文告诉大家如何使用WPF的自定义布局做等距布局实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于StackPanel的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。......
  • 机器学习四大框架详解及实战应用:PyTorch、TensorFlow、Keras、Scikit-learn
    目录框架概述PyTorch:灵活性与研究首选TensorFlow:谷歌加持的强大生态系统Keras:简洁明了的高层APIScikit-learn:传统机器学习的必备工具实战案例图像分类实战自然语言处理实战回归问题实战各框架的对比总结选择合适的框架1.框架概述机器学习框架在开发过程中起着至......
  • JVM系列(四) -内存布局详解
    一、摘要熟悉Java语言特性的同学都知道,相比C、C++等编程语言,Java无需通过手动方式回收内存,内存中所有的对象都可以交给Java虚拟机来帮助自动回收;而像C、C++等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java应用程序......
  • 降低数据平台成本 ,Apache Airflow迁移上云案例分享
    本文分享自华为云社区《华为云DTSE团队通过开源专业服务,助力马来西亚X集团平滑迁移上云》,作者:华为云开发者联盟DTSE团队。1  摘要本文主要介绍了华为云DTSE助力马来西亚X集团部署开源工作流平台ApacheAirflow的案例。Airflow是一款面向数据处理场景,提供以编程方式编写、调度......
  • tensorflow快速入门--如何定义张量、定义网络结构、超参数设置、模型训练???
    前言由于最近学习的东西涉及到tensorflow的使用,故先简单的学习了一下tensorflow中如何定义张量、定义网络结构、超参数设置、模型训练的API调用过程;欢迎大家,收藏+关注,本人将持续更新。文章目录1、基本操作1、张量基础操作创建0维度张量创建1维张量创建多维张量2、转换......
  • CSS Flex 布局教程
    简介弹性盒子是CSS3的一种新的布局模式。CSS3弹性盒(FlexibleBox或flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白......
  • 仓库布局对拣选效率的影响
    根据国外研究,拣货过程中最耗时的部分是移动,平均占用拣货人员的55%的时间,其次是纸质单据填写和其他活动(20%)、查找货物(15%)和搬运货物(10%)。出于这个原因,围绕改进拣货流程的大部分工作是在减少查找货物及移动时间。精明的仓库管理者利用80/20规则来提高拣货效率。既20%的产品......