Flutter笔记:Widgets Easier组件库 - 使用标签(Tag)

Flutter笔记
Widgets Easier组件库 - 使用标签(Tag)

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/138425637
HuaWei:https://bbs.huaweicloud.com/blogs/426978

组件库地址

  • Pub.Dev:https://pub.dev/packages/widgets_easier
  • GitHub:https://github.com/jacklee1995/widgets_easier

【介绍】:本文介绍Flutter的Widgets Easier组件库中:Widgets Easier组件库 - 标签(Tag)的使用方法。

flutter-ljc](https://jclee95.blog.csdn.net/)


上一节:《 - | 下一节:《 -


1. 概述

1.1 关于Widgets Easier

本库是一个 Flutter 组件库,旨在提供用于Flutter开发的组件,使得开发者能够更简单地构建出更丰富地界面效果。项目地址为:

  • https://github.com/jacklee1995/widgets_easier

  • https://pub.dev/packages/widgets_easier

1.2 模块安装

在你的Flutter项目中,运行下面的命令:

flutter pub add widgets_easier

即可安装最新版本的 Widgets Easier 库。

2. 基本用法

2.1 语义类型

通过Tag组件的type参数可以使用一个语义性色彩。例如:

const Row(mainAxisAlignment: MainAxisAlignment.spaceAround,children: [Tag('tag', type: SemanticEnum.primary),Tag('tag', type: SemanticEnum.secondary),Tag('tag', type: SemanticEnum.info),Tag('tag', type: SemanticEnum.success),Tag('tag', type: SemanticEnum.warning),Tag('tag', type: SemanticEnum.danger),Tag('tag', type: SemanticEnum.fatal),],
),

在这里插入图片描述

2.2 样式主题

受启发与Element-plus,Tag有3个样式主题,plainlightdark,默认情况下为palin,正如上一节所展示的那样。下面展示lightdark两个主题:

light

const Row(mainAxisAlignment: MainAxisAlignment.spaceAround,children: [Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.primary),Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.secondary),Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.info),Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.success),Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.warning),Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.danger),Tag('tag', theme: TagThemeEnum.light, type: SemanticEnum.fatal),],
),

在这里插入图片描述

dark

const Row(mainAxisAlignment: MainAxisAlignment.spaceAround,children: [Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.primary),Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.secondary),Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.info),Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.success),Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.warning),Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.danger),Tag('tag', theme: TagThemeEnum.dark, type: SemanticEnum.fatal),],
),

在这里插入图片描述

2.3 圆角

默认有一个大小为4的圆角,若要手动修改可以通过指定radius参数。radius参数接受一个double值。例如,设置radius为0则没有圆角:

Tag('radius: 0', radius: 0),

在这里插入图片描述

2.4 尺寸

枚举尺寸

例如:

Tag('SizeEnum.small', size: SizeEnum.small),
Tag('SizeEnum.defaultSize', size: SizeEnum.defaultSize),
Tag('SizeEnum.large', size: SizeEnum.large),

数值尺寸

通过height参数可以指定数值作为尺寸。height一经指定,则size失效。例如,指定高度为50:

Tag('hignt=50', height: 50),

在这里插入图片描述

收缩属性

通过指定shrink属性为flase,可以使一个标签尽可能占满一行,例如:

Tag('shrink: false', shrink: false)

在这里插入图片描述

2.5 可关闭标签

通过指定 closable: true,将展示一个关闭图标。例如:

const Row(mainAxisAlignment: MainAxisAlignment.spaceAround,children: [Tag('tag', closable: true, type: SemanticEnum.primary),Tag('tag', closable: true, type: SemanticEnum.secondary),Tag('tag', closable: true, type: SemanticEnum.info),Tag('tag', closable: true, type: SemanticEnum.success),Tag('tag', closable: true, type: SemanticEnum.warning),Tag('tag', closable: true, type: SemanticEnum.danger),Tag('tag', closable: true, type: SemanticEnum.fatal),],
),

在这里插入图片描述

2.6 动态编辑标签示例

可以通过点击标签关闭按钮后触发的 onClose 事件来实现动态编辑标签。例如:

import 'package:flutter/material.dart';
import 'package:widgets_easier/widgets_easier.dart';class DynamicTagsExample extends StatefulWidget {const DynamicTagsExample({super.key});State<DynamicTagsExample> createState() => _DynamicTagsExampleState();
}class _DynamicTagsExampleState extends State<DynamicTagsExample> {final List<String> _tags = ['Tag 1', 'Tag 2', 'Tag 3'];final String _newTagButtonText = '+ 添加 Tag';void _handleClose(int index) {setState(() {_tags.removeAt(index);});}void _handleSubmitted(String value) {if (value.isNotEmpty) {setState(() {_tags.add(value);});}}Widget build(BuildContext context) {return Wrap(spacing: 8,runSpacing: 8,children: [Text('$_tags'),for (int index = 0; index < _tags.length; index++)Tag(key: UniqueKey(), // 重要_tags[index],type: SemanticEnum.primary,theme: TagThemeEnum.light,closable: true,onClose: (_) {_handleClose(index);},),Tag(_newTagButtonText,type: SemanticEnum.danger,editable: true,restoreAfterSubmitted: true,onSubmitted: _handleSubmitted,),],);}
}

效果如下:
在这里插入图片描述

另外,这个例子恰好是一定要指定key的例子,顺便说一下一种错误情况。

在没有使用 key 的情况下,Flutter 在构建组件树时,会根据组件的位置来匹配新旧组件。当删除一个 Tag 时,其后面的 Tag 会向前移动,占据被删除的 Tag 的位置。但是,Flutter 并不知道这种位置的变化,它仍然认为在原来的位置上的 Tag 与之前的 Tag 相同,导致视图没有正确更新。

这里,初始的 _tags 列表为 ['Tag 1', 'Tag 2', 'Tag 3'],不断点击第一个Tag的close图标,看起来效果就成了这样:

在这里插入图片描述

在这个过程中:

  1. Flutter 根据这个列表构建了三个 Tag 组件,它们在组件树中的位置分别为 0, 1, 2;

  2. 现在,如果你删除了 ‘Tag 1’,_tags 列表变为 ['Tag 2', 'Tag 3']

  3. Flutter 在更新组件树时,会比较新的组件列表与旧的组件列表:

    • 在位置 0,它发现新的组件列表中有一个 Tag 组件,显示 ‘Tag 2’。但在旧的组件列表中,这个位置显示的是 ‘Tag 1’。因为 Flutter 使用位置来匹配组件,所以它认为这个 Tag 组件没有变化,仍然显示 ‘Tag 1’;

    • 在位置 1,它发现新的组件列表中有一个 Tag 组件,显示 ‘Tag 3’。同样,因为位置匹配,Flutter 认为这个 Tag 组件没有变化,仍然显示 ‘Tag 2’;

    • 在位置 2,它发现新的组件列表中没有 Tag 组件了,所以它会移除这个位置的 Tag 组件。

  4. 最终,视图中显示的 Tag 组件是 ‘Tag 1’ 和 ‘Tag 2’,而不是 ‘Tag 2’ 和 ‘Tag 3’。

后面再次点击时类似。这就导致了在没有使用 key 的情况下,删除操作会导致视图与实际数据不一致。

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

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

相关文章

【个人博客搭建】(17)使用FluentValidation 参数校验

FluentValidation 是一个用于 .NET 的开源验证库&#xff0c;它提供了一种流畅的接口和强类型验证规则&#xff0c;使得验证逻辑表达得更加清晰和简洁。&#xff08;Apache-2.0&#xff09; FluentValidation 的主要作用包括&#xff1a; 提高代码可读性&#xff1a;通过使用 F…

【打赏收款收银台多合一支付收款HTML源码】

打赏收款收银台多合一支付收款HTML源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <!DOCTYPE HTML> <html> <head> <title>打赏台</title> <meta name"keywords" content"收银台,个人收款二维码,支付宝在线收款,微…

PostgreSQL连接拒绝如何解决和排查?

1. 服务器未运行 解决方案&#xff1a;确保 PostgreSQL 服务已启动。在 Linux 上&#xff0c;你可以使用如下命令来检查服务状态&#xff1a;sudo systemctl status postgresql如果服务未运行&#xff0c;使用以下命令启动它&#xff1a;sudo systemctl start postgresql2. Po…

C#图像处理实例1:opencvsharp获取轮廓凸包

在OpenCvSharp中&#xff0c;你可以使用Cv2.ApproxPolyDP函数来获取轮廓的凸包。这个函数使用Douglas-Peucker算法来近似轮廓。 以下是一个简单的例子&#xff0c;展示如何使用OpenCvSharp获取轮廓的凸包&#xff1a; Mat src Cv2.ImRead("保存图像\2.jpg", ImreadM…

偏微分方程算法之椭圆型方程差分格式编程示例

目录 一、示例1-五点菱形格式 1.1 C代码 1.2 计算结果 二、示例2-九点紧差分格式 2.1 C代码 2.2 计算结果 三、示例3-二阶混合边值 3.1 C代码 3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍&#xff0c;并给出相应格式的理论推导过程。为加深对…

10 华三vlan技术介绍

AI 解析 -Kimi-ai Kimi.ai - 帮你看更大的世界 (moonshot.cn) 虚拟局域网&#xff08;VLAN&#xff09;技术是一种在物理网络基础上创建多个逻辑网络的技术。它允许网络管理员将一个物理网络分割成多个虚拟的局域网&#xff0c;这些局域网在逻辑上是隔离的&#xff0c;但实际…

流量分析。

流量分析 在Wireshak抓包可以看到正常的执行流程如下&#xff1a; ● Client向Server发起Load data local infile请求 ● Server返回需要读取的文件路径 ● Client读取文件内容并发送给Server ● PS&#xff1a;在本机上启动服务端与客户端&#xff0c;启动wireshark 抓包&…

Magic Studio Eraser API使用教程

AI橡皮擦 - 使用网址 Magic Studio的AI橡皮擦功能非常好用&#xff0c;能去除图片中的杂物。但是网页版只支持低分辨率下载&#xff0c;想要原图就得开会员&#xff0c;价格不菲。 不过官网其实提供了API接入方式&#xff0c;并且有100次的免费试用机会 API接入网站 在这里可…

数据结构===树

文章目录 概要概念相关概念 有哪些常用的树小结 概要 树是一种新的数据结构&#xff0c;不同于数组&#xff0c;链表。就像大自然中的树&#xff0c;看下这个数据结构&#xff0c;很有意思&#xff0c;有一个主干&#xff0c;然后还有很多树叉&#xff0c;即支干。不错&#xf…

全方位了解 Meta Llama 3

本文将为您提供 Llama 3 的全面概览&#xff0c;从其架构、性能到未来的发展方向&#xff0c;让您一文了解这一革命性大语言模型的所有要点。 Meta Llama 发展历程 Llama 1 Llama 是由 Meta(FaceBook) AI 发布的一个开源项目&#xff0c;允许商用&#xff0c;影响力巨大。Lla…

生成requirements.txt文件

前言 对于Python项目&#xff0c;生成和使用requirements.txt是十分必要的。通过requirements.txt可以一次性保存和安装项目所需要的所有库。尤其是在复现github上的实验代码时。 方法1 常用的命令 pip freeze > requirements.txt然而这种方法并不好用&#xff0c;有时会…

【C++】stack、queue和priority_queue的模拟实现

在本篇博客中&#xff0c;作者将会讲解STL中的stack、queue和priority_queue的模拟实现&#xff0c;同时还会带大家了解一下deque这个容器。 一.什么是适配器 STL中一共有6大组件&#xff1a;容器&#xff0c;适配器&#xff0c;空间配置器&#xff0c;仿函数&#xff0c;迭代器…