Flutter实现简单Tag效果

前置知识点整理

Wrap

在 Flutter 中,`Wrap` 是一种布局小部件,用于在水平或垂直方向上自动换行子小部件。它类似于 CSS 中的 `flex-wrap`,适合用于需要动态换行的布局场景,比如标签云、照片网格等。

`Wrap` 的基本属性

  • `direction`:决定子小部件的布局方向,默认为 `Axis.horizontal`。可以设置为 `Axis.vertical`,这将使子小部件从上到下排列。
  • `alignment`:沿主轴对齐子小部件的方式。类似于 `Row` 和 `Column` 的 `mainAxisAlignment`。
  • `spacing`:在主轴方向上的子小部件之间的间距。
  • `runAlignment`:沿交叉轴对齐每个运行中的子小部件。类似于 `Column` 的 `crossAxisAlignment`。
  • `runSpacing`:在交叉轴方向上的运行之间的间距。
  • `clipBehavior`:决定超出边界的子小部件的裁剪方式。

简单示例

import 'package:flutter/material.dart';class WrapPageDemo extends StatelessWidget {const WrapPageDemo({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Wrap Example')),body: Center(child: Wrap(direction: Axis.horizontal,alignment: WrapAlignment.start,spacing: 8.0,// 主轴(水平)方向上的间距runAlignment: WrapAlignment.center,runSpacing: 4.0,// 交叉轴(垂直)方向上的间距children: List.generate(10, (index) {return Chip(label: Text('Item $index'),avatar: CircleAvatar(backgroundColor: Colors.blue,child: Text('$index'),),);}),),),),);}
}

使用场景

  • 动态布局:当您不知道子小部件的确切数量或者它们的大小可能会改变时,`Wrap` 可以帮助实现自适应布局。
  • 响应式设计:在不同屏幕尺寸下需要不同的布局时,`Wrap` 可以动态地调整行和列的数量。
  • 标签或按钮组:用于显示一组标签、按钮或其他小部件,这些小部件需要根据可用空间自动换行。

通过 `Wrap`,开发者可以轻松实现自适应的、灵活的布局,而不必手动管理换行和对齐问题。

EdgeInsets.symmetric

`EdgeInsets.symmetric` 是 Flutter 中的一个用于创建对称填充或边距的构造方法。它属于 `EdgeInsets` 类,这个类用于定义四个方向(上、下、左、右)的填充或边距。

`EdgeInsets.symmetric` 使用

`EdgeInsets.symmetric` 允许您同时指定水平和垂直方向的填充或边距,而不必为每个方向单独设置。它是 `EdgeInsets` 的一个便利构造方法,用于简化代码。

构造函数
EdgeInsets.symmetric({double horizontal = 0.0,double vertical = 0.0,
})
  • `horizontal`: 控制左和右两侧的填充或边距。
  • `vertical`: 控制上和下两侧的填充或边距。

使用场景

  • 对称布局: 当您需要在小部件的两侧设置相同的边距或填充时,使用 `EdgeInsets.symmetric` 可以让代码更简洁。
  • 快速布局调整: 通过调整水平和垂直参数,可以快速实现对称的视觉效果,非常适合用于按钮、卡片等需要均匀填充的 UI 组件。

`EdgeInsets.symmetric` 是一个非常有用的工具,用于简化 UI 布局和调整填充与边距,特别是在需要对称的情况下。

BoxDecoration

`BoxDecoration` 是 Flutter 中用于绘制容器(`Container`)背景的一个类。它允许您使用颜色、渐变、图像、边框和阴影等来装饰容器,从而创建丰富的视觉效果。`BoxDecoration` 常用于提升应用界面的美观性和用户体验。

`BoxDecoration` 的主要属性

以下是 `BoxDecoration` 类的主要属性及其用途:

1.`color`:

  • 设置容器的背景颜色。
  • 例如:`color: Colors.blue`。

2.`gradient`:

  • 设置背景的渐变色。
  • 支持线性渐变(`LinearGradient`)、径向渐变(`RadialGradient`)等。
  • 例如:
gradient: LinearGradient(colors: [Colors.red, Colors.blue],begin: Alignment.topLeft,end: Alignment.bottomRight,
)

3.`image`:

  • 设置背景图像。
  • 使用 `DecorationImage` 来指定图像及其适配方式。
  • 例如:
image: DecorationImage(image: AssetImage('assets/background.png'),fit: BoxFit.cover,
)

4.`border`:

  • 设置容器的边框。
  • 可以使用 `Border.all()` 创建统一的边框,或使用 `Border()` 设置不同方向的边框。
  • 例如:
border: Border.all(color: Colors.black,width: 2.0,
)

5.`borderRadius`:

  • 设置容器的圆角边框。
  • 使用 `BorderRadius.circular()` 为四个角设置相同的圆角半径。
  • 例如:`borderRadius: BorderRadius.circular(10.0)`

6.`boxShadow`:

  • 设置容器的阴影效果。
  • 使用 `BoxShadow` 来定义阴影的颜色、模糊半径、偏移等。
  • 例如:
boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.5),spreadRadius: 5,blurRadius: 7,offset: Offset(0, 3), // changes position of shadow),
]

 

7.`shape`:

  • 设置容器的形状。
  • 可以是 `BoxShape.rectangle`(默认为矩形)或 `BoxShape.circle`。
  • 注意:如果使用 `BoxShape.circle`,`borderRadius` 会被忽略。

 示例代码

import 'package:flutter/material.dart';class MyBoxDecorationDemoPage extends StatelessWidget {const MyBoxDecorationDemoPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('BoxDecoration Example'),),body: Center(child: Container(width: 200,height: 200,decoration: BoxDecoration(color: Colors.blue,borderRadius: BorderRadius.circular(15),boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.2),spreadRadius: 2,blurRadius: 2,offset: const Offset(3, 3))],border: Border.all(color: Colors.white, width: 2)),child: const Center(child: Text('Hello, Flutter!',style: TextStyle(color: Colors.white, fontSize: 18),),),),),);}
}

应用场景

`BoxDecoration` 非常适合用于需要自定义背景的组件,例如:

  • 卡片视图:可以用来创建带有阴影和圆角的卡片。
  • 按钮:通过 `BoxDecoration` 和 `GestureDetector`,可以创建自定义的按钮样式。
  • 用户头像:结合 `BoxShape.circle` 和 `DecorationImage`,可以用来裁剪圆形头像。

通过 `BoxDecoration`,您可以灵活地控制容器的外观,使得 Flutter 应用能够根据设计需求进行细致的定制。

标签简单实现

import 'package:flutter/material.dart';class MyTagDemoPage extends StatelessWidget {const MyTagDemoPage({super.key});@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("TagDemoPage"),),body: Wrap(children: <Widget>[const MyTagItem("Start"),for (var item in tags) MyTagItem(item),const MyTagItem("End"),],),);}
}class MyTagItem extends StatelessWidget {final String text;const MyTagItem(this.text, {super.key});@overrideWidget build(BuildContext context) {return Container(padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),decoration: BoxDecoration(color: Colors.blueAccent.withAlpha(50),borderRadius: const BorderRadius.all(Radius.circular(5))),child: Text(text),);}
}const List<String> tags = ["AAAAAAAAAAAAA","BBBBBBBBBBB","C","DD","EEEEEEEEE","1111111111","222","%%%","****","@@@","**","ssssss"
];

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot中使用mongodb完成评论功能

pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…

layui-vue第三方库表格列事件怎么写

插槽写入列点击事件 <div class"le-table-box" ref"TableBoxRef" :style"{ height: ShowPage ? calc(100% - 60px) : 100% }"><lay-table row-double"dbRowClick" :columns"TableColumn" :data-source"Table…

【docker】docker build上下文

什么是 Docker Build 上下文&#xff1f; 在 Docker 中&#xff0c;构建上下文&#xff08;Build Context&#xff09; 是指在执行 docker build 命令时&#xff0c;Docker 会发送给 Docker 引擎的所有文件和目录的集合。构建上下文包含了 Dockerfile 和用于构建镜像的所有文件…

[在线实验]-Redis Docker镜像的下载与部署

镜像下载 dockerredis镜像资源-CSDN文库 加载镜像 使用以下命令从redis.tar文件中加载Docker镜像 docker load --input redis.tar 创建映射目录 为了确保Redis的数据能够持久化&#xff0c;我们需要创建一个本地目录来存储这些数据 mkdir -p datasource/docker/redis 运…

Flink CDC 使用实践以及遇到的问题

背景 最近公司在做一些业务上的架构调整&#xff0c;有一部分是数据从mysql采集到Starrocks&#xff0c;之前的一套方法是走 debezium 到 puslar 到 starrocks,这一套下来比较需要配置很多东西&#xff0c;而且出现问题以后&#xff0c;需要修改很多配置&#xff0c;而且现阶段…

配置idea环境进行scala编程

这里用的jdk是jdk-8u161,scala版本是2.12.0 在d盘新建一个本地仓库用来存放下载的maven包&#xff0c;在里面创建如下两个文件 更改settings文件为下面的样子 点击左下角的设置&#xff0c;更改maven本地仓库的位置&#xff08;默认在c盘用户目录下的.m2文件中&#xff0c;更改…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容&#xff0c;与 cat 命令的输出顺序相反。非常有趣&#xff0c;好记。也就是说&#xff0c;当我们使用tac命令查看文件内…

mimic插件使用

最近搞机械臂的末端夹具&#xff0c;本来想用吸盘的插件的&#xff0c;不知道为什么吸盘吸不起来可乐瓶&#xff0c;后面就换成夹爪了。 因为原厂的urdf文件中提供夹爪是用mimic标签控制剩下的5个joint关节的&#xff0c;网上参考的资料太少了&#xff0c;也是废了好多力 气&am…

M31系列LoRa分布式IO模块功能简介

M31系列LoRa 分布式 IO 模块简介 M31系列LoRa分布式IO主机模块是一款强大的无线远程控制与采集设备&#xff0c;该设备采用 LoRa 无线技术&#xff08;内置了无线模块&#xff09;&#xff0c;可通过串口或远程 LoRa 组网设备发送 Modbus RTU 指令进行控制&#xff0c;可搭配E…

在 Ubuntu 系统中设置静态 IP 地址,解决重启地址丢失问题

在 Ubuntu 系统中设置静态 IP 地址&#xff0c;可以通过修改网络配置文件来实现。以下是具体步骤&#xff1a; 使用 netplan 配置&#xff08;Ubuntu 18.04 及以上版本&#xff09; 打开配置文件&#xff1a; netplan 的配置文件通常位于 /etc/netplan/ 目录下&#xff0c;文件…

【深度学习】服务器常见命令

1、虚拟环境的安装位置 先进入虚拟环境 which python2、升序查看文件内容 ls -ltr3、查看服务器主机空间使用情况 df -hdf -h .4、查看本地空间使用情况 du -sh ./*du -sh * | sort -nr5、查找并删除进程 # 查找 ps aux# 删除 kill -KILL pid6、查看服务器配置 lscpuuna…

Spring boot之BeanDefinition介绍

在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程&#xff0c;它并不像我们创建对象一样只是直接new一下就行&#xff0c;虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中&#xff0c;BeanDefinition作…

redis基础spark操作redis

Redis内存淘汰策略 将Redis用作缓存时&#xff0c;如果内存空间用满&#xff0c;就会自动驱逐老的数据。 为什么要使用内存淘汰策略呢&#xff1f; 当海量数据涌入redis&#xff0c;导致redis装不下了咋办&#xff0c;我们需要根据redis的内存淘汰策略&#xff0c;淘汰一些不那…

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…

力扣--LCR 150.彩灯装饰记录II

题目 代码 if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();queue.add(root);while(!queue.isEmpty()){int k queue.size();List<Integer> …

RFdiffusion Potential类解读

1. Potential 类 功能 Potential 是一个接口类(抽象类),用于定义潜在函数的接口,要求继承它的类必须实现 compute 方法。它的设计遵循 面向对象编程的多态性原则,通过抽象接口确保子类实现特定功能,同时定义了一个通用的 API(即 compute 方法)。源代码: class Poten…

一款.NET开源的Windows资源管理器标签页工具

前言 今天大姚给大家分享一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具&#xff1a;QTTabBar。 工具介绍 QTTabBar是一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具。从此以后工作时不再遍布文件夹窗口&#xff0c…

PVE中VLAN的设置要点

使用这个拓扑进行连接无法直接访问PVE PVE 是这样设置如下&#xff1a; 核心重点&#xff1a;PVE 的 vmbr0 接口直接绑定了 enp2s0&#xff0c;这会导致 VLAN 流量无法正确处理&#xff0c;因为 PVE 没有专门为 VLAN 3 配置接口。 1.vmbr0 和 vmbr0.3 都是绑定在物理接口 enp2…

Spring事务管理学习记录

一、概念 事务&#xff08;Transaction&#xff09;是指一组操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。事务的四大特性&#xff08;ACID&#xff09;确保了数据的完整性和一致性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a…

长城上,低空下,北京联通点亮5G-A的时代星光

2024年&#xff0c;被认为是5G-A的商用元年。在这个关键节点&#xff0c;大部分普通人最关心的问题可能是5G-A的引入、网络能力的提升&#xff0c;究竟能给我们带来哪些实用价值&#xff1f;在城市中到底有什么应用场景&#xff1f; 面对上述大众关切的问题&#xff0c;首善之都…