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.mzph.cn/diannao/9332.shtml

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

相关文章

电路板维修【一】

最近喜欢上了电路板维修&#xff0c;经常看很多博主的维修视频&#xff0c;觉得还是颇有收获的&#xff08;维修板子原来有方法可循&#xff09;&#xff0c;于是做笔记如下&#xff1a; 一.【修了半天也没找到问题&#xff0c;原来是检查方向错了&#xff0c;变频油烟机板维修…

LifeCycle之ProcessLifeCycleOwner

问题&#xff1a;想要知道应用程序当前处在前台、后台、或从后台回到前台&#xff0c;想要知道应用的状态&#xff0c; LifeCycle提供了ProcessLifeCycleOwner的类&#xff0c;方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…

如何设置内网打印机端口网络穿透到公网

打印机是当前公司企业办公输出纸质文件处理过程中必不可少的工具设备。出差在外&#xff0c;我们经常会面对需要远程使用公司内部打印机复印或打印各种文件资料的情况&#xff0c;或不在家又需要远程访问家里打印机进行打印的情况。这时候&#xff0c;就必须学会远程打印的方法…

C++类和对象(三) 缺省值 | static成员 | 内部类

前言&#xff1a; 这是关于类和对象的最后一篇文章&#xff0c;当然还是基础篇的最后一篇&#xff0c;因为类的三大特性继承&#xff0c;封装和多态都还没有讲&#xff0c;少年&#xff0c;慢慢来。 缺省值&#xff1a; 之前讲过&#xff0c;在C11的新标准中&#xff0c;支持为…

vue3 - 图灵

目录 vue3简介整体上认识vue3项目创建Vue3工程使用官方脚手架创建Vue工程[推荐] 主要⼯程结构 数据双向绑定vue2语法的双向绑定简单表单双向绑定复杂表单双向绑定 CompositionAPI替代OptionsAPICompositionAPI简单不带双向绑定写法CompositionAPI简单带双向绑定写法setup简写⽅…

【机器学习之 sklearn 基础教程】

文章目录 机器学习之 sklearn 基础教程1. 引言2. 安装 sklearn3. 数据集3.1 加载数据集3.2 数据集划分 4. 数据预处理4.1 特征缩放4.2 编码分类特征 5. 模型训练与评估5.1 模型训练5.2 模型评估5.3 交叉验证 6. 模型调参7. 模型调参&#xff08;续&#xff09;7.1 GridSearchCV…

【C++后端项目】负载均衡OJ服务器

文章目录 一、演示项目二、所用技术与开发环境所用技术开发环境 三、项目宏观结构I. 风格&#xff1a;仿leetcodeII. 结构&#xff1a;Browser-Server模式III. 编写思路&#xff1a;编译服务 -> OJ服务 -> 前端设计 四、关于Git分支管理✨4.1 Git 分支结构4.2 Git 分支命…

mac电脑如何安装java

1、检查当前系统的 Java 版本 打开终端,输入以下命令查看当前 Java 版本 /usr/bin/java -version 2、前往 Java 官网下载 Java JDK 打开 Java 官网 (https://www.java.com/zh-CN/download/) 并下载最新版本的 Java JDK。 3、安装 Java JDK 双击下载的 .dmg 文件启动安装程序…

Springboot集成Netflix-ribbon、Consul实现负载均衡调用-09

Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康检查、键值存储等功能。 核心功能 服务发现&#xff1a;Consul通过DNS…

Node.js版本管理工具nvm安装

1.下载nvm https://github.com/coreybutler/nvm-windows/releaseshttps://github.com/coreybutler/nvm-windows/releases 2.安装nvm 双击打开下载好的压缩包解压出的文件 目录中不要有中文 这个是配置切换node版本后的存储位置 然后一路下一步就行了 3.安装并使用node 安装…

LPDDR5电路设计的新功能

最近因为需要使用到LPDDR5&#xff0c;快速地浏览了JEDEC标准文档&#xff0c;发现与前几代相比出现了一些新的电路设计功能&#xff0c;总结为如下三点&#xff1a; 1. CK/WCK/RDQS时钟方案&#xff1b; 2. 电源的PDN设计目标&#xff1b; 3. DQ, DMI和RDQS的Rx端DFE均衡技术。…

LLM大语言模型(十五):LangChain的Agent中使用自定义的ChatGLM,且底层调用的是remote的ChatGLM3-6B的HTTP服务

背景 本文搭建了一个完整的LangChain的Agent&#xff0c;调用本地启动的ChatGLM3-6B的HTTP server。 为后续的RAG做好了准备。 增加服务端role&#xff1a;observation ChatGLM3的官方demo&#xff1a;openai_api_demo目录 api_server.py文件 class ChatMessage(BaseModel…

Unity 性能优化之GPU Instancing(五)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、GPU Instancing使用方法二、使用GPU Instancing的条件三、GPU Instancing弊端四、注意五、检查是否成功总结 前言 GPU Instancing也是一种Draw call…

AppImage 创建快捷方式

AppImage是什么&#xff1f; AppImage 是一个可下载的 Linux 文件&#xff0c;它内部包含一个应用程序和应用程序所需的一切&#xff08;库、图标、字体等&#xff09;。 官网 https://appimage.org/ 如何运行 AppImage 很简单&#xff0c;下载一个 AppImage&#xff0c;给…

PowerShell ⇒ Excel 批量创建Excel

New-Object -ComObject Excel.Application&#xff1a;创建Excel对象[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null 用来显式释放 Excel COM 对象的资源&#xff0c;以确保在脚本执行完成后&#xff0c;释放 Excel 进程和相关资源&#xff0…

揭秘:让代码更优雅的七大面向对象设计秘诀

软件项目中&#xff0c;需求是不断变化的&#xff0c;需求也是项目中最难把控的&#xff0c;需求的变更也是无法避免的。我们写的软件程序&#xff0c;如何能实现拥抱变化&#xff0c;使我们的软件达到可维护和可复用&#xff0c;这是一代代软件工程师不断追寻的真理。 导致一个…

接口数据脱敏实现方案

背景 敏感信息如手机号、身份证、邮箱等信息需要脱敏后展示给前台&#xff0c;如果需要查看&#xff0c;则需要申请权限&#xff0c;查询时需要记录操作日志。 方案 通过JsonSerializer和注解&#xff0c;在json序列化的时候做脱敏操作 此处使用redis存储了加密后的key和明…

认养小游戏功能介绍

认养小游戏通常模拟了真实的农业生产过程&#xff0c;让玩家能够在线上体验种植、养殖的乐趣。以下是一些常见的认养小游戏功能介绍&#xff1a; 选择认养的农产品&#xff1a;首先&#xff0c;玩家可以从游戏中提供的多种农产品中选择自己想要认养的种类&#xff0c;如蔬菜、…

【Java一些注解知识】

RequestMapping RequestMapping是Spring框架中的一个注解&#xff0c;用于将HTTP请求映射到特定的处理方法上。通过使用RequestMapping注解&#xff0c;我们可以指定处理方法应该处理的URL路径和HTTP请求方法。 下面是一个简单的示例&#xff1a; 假设我们有一个UserControl…

[wp]第一届 “帕鲁杯“ --应急响应

1.前言&#xff1a; 第一次做这么大规模的应急响应靶场&#xff0c;收获许多 2.拓补图&#xff1a; 3.资产清单 4.解题 1. 签到[堡垒机的flag标签的值] [BrYeaVj54009rDIZzu4O] 2. 提交攻击者第一次登录时间 2024/04/11/14:21:18 3. 提交攻击者源IP 192.168.1.4 4. 提交…