Flutter Chen Generator

🚀 一个强大的Flutter代码生成工具包,包含多个实用的代码生成器。

✨ 功能特性

📁 资源生成器 (Assets Generator)

  • 🔄 自动扫描assets目录并生成Dart常量
  • 🧠 智能驼峰命名转换,保持原有驼峰格式
  • 🔧 处理文件命名冲突(同名不同扩展名)
  • 📝 自动更新pubspec.yaml配置

🎨 图标字体生成器 (IconFont Generator)

  • 📄 解析iconfont.json文件自动生成Dart图标常量
  • 🏷️ 智能命名转换(支持横线转驼峰)
  • 🔧 支持多种JSON格式(iconfont.cn、自定义格式等)
  • 🎯 类型安全的IconData常量

🔮 未来计划

  • 🌐 国际化自动化脚本: 自动把项目国际化、导入导出excel
  • 📱 ScreenUtil自动化脚本: 自动智能添加ScreenUtil后缀

🚀 快速开始

安装

dart pub global activate flutter_chen_generator

🎨 Flutter IconFont Generator

从iconfont.json文件自动生成Flutter图标字体Dart文件的工具。

✨ 功能特性

  • 📄 解析iconfont.json文件自动生成Dart图标常量
  • 🏷️ 智能命名转换(支持横线转驼峰)
  • 🔧 支持多种JSON格式(iconfont.cn、自定义格式等)
  • 🎯 类型安全的IconData常量
  • 🛠️ 可选的扩展方法生成
  • ⚙️ 灵活的配置选项

🚀 使用方法

基本使用

# 使用默认配置
flutter_chen_iconfont# 或通过主入口
flutter_chen_generator iconfont

高级配置

flutter_chen_iconfont \--input assets/fonts/icons.json \--output lib/icons.dart \--class-name MyIcons \--font-family MyFont \--extensions

📋 命令行参数

参数短参数说明默认值
--input-iJSON输入文件assets/fonts/iconfont.json
--output-oDart输出文件lib/generated/iconfont.dart
--class-name-c生成的类名IconFont
--font-family-f字体家族名称ComIcon
--extensions-生成扩展方法false
--help-h帮助信息-

📄 支持的JSON格式

1. iconfont.cn 标准格式

{"glyphs": [{"font_class": "home","unicode_decimal": 58880},{"font_class": "user-circle","unicode_decimal": 58881}]
}

2. 自定义格式

{"icons": [{"name": "home", "code": 58880},{"name": "user-circle","unicode": "0xe601"}]
}

3. 直接数组格式

[{"font_class": "home","unicode_decimal": 58880},{"font_class": "user-circle","unicode_decimal": 58881}
]

📂 生成示例

基本生成的代码

/// 自动生成的图标字体文件,请勿手动修改
/// Generated by flutter_chen_iconfont_generator
/// Total icons: 2
import 'package:flutter/material.dart';/// IconFont 图标字体类
/// 字体家族: ComIcon
class IconFont {IconFont._();/// 字体家族名称static const String fontFamily = 'ComIcon';/// home 图标static const IconData home = IconData(0xe600,fontFamily: 'ComIcon',);/// user-circle 图标static const IconData userCircle = IconData(0xe601,fontFamily: 'ComIcon',);
}

包含扩展方法的代码

class IconFont {// ... 基本内容/// 所有图标列表static const List<IconData> allIcons = [home,userCircle,];/// 根据名称获取图标static IconData? getByName(String name) {switch (name) {case 'home': return home;case 'user-circle': return userCircle;default: return null;}}
}/// IconData 扩展方法
extension IconFontExtension on IconData {/// 创建 Icon 组件Icon icon({double? size,Color? color,String? semanticLabel,TextDirection? textDirection,}) {return Icon(this,size: size,color: color,semanticLabel: semanticLabel,textDirection: textDirection,);}
}

🎯 命名转换规则

横线转驼峰

  • homehome
  • user-circleuserCircle
  • my-awesome-iconmyAwesomeIcon
  • icon_nameiconName

特殊字符处理

  • 数字开头:123iconicon123icon
  • 空字符串:""icon
  • 特殊字符:icon@#$icon

🔧 配置字体文件

pubspec.yaml 中添加字体配置:

flutter:fonts:- family: ComIcon  # 与 --font-family 参数一致fonts:- asset: assets/fonts/iconfont.ttf

💡 使用方法

基本使用

import 'package:flutter/material.dart';
import 'generated/iconfont.dart';class MyWidget extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(body: Column(children: [// 基本使用Icon(IconFont.home),// 自定义样式Icon(IconFont.userCircle,size: 32,color: Colors.blue,),// 在按钮中使用IconButton(icon: Icon(IconFont.home),onPressed: () {},),],),);}
}

使用扩展方法

// 需要先生成扩展方法:flutter_chen_iconfont --extensions// 使用扩展方法快速创建图标
IconFont.home.icon(size: 24,color: Colors.red,
)// 根据名称获取图标
final icon = IconFont.getByName('home');
if (icon != null) {Icon(icon)
}// 遍历所有图标
for (final iconData in IconFont.allIcons) {Icon(iconData)
}

💡 使用技巧

1. 批量处理多个图标文件

# 处理不同的图标集
flutter_chen_iconfont -i assets/fonts/ui-icons.json -o lib/ui_icons.dart -c UiIcons
flutter_chen_iconfont -i assets/fonts/brand-icons.json -o lib/brand_icons.dart -c BrandIcons

2. CI/CD 集成

# .github/workflows/flutter.yml
- name: Generate IconFontrun: flutter_chen_iconfont --input assets/fonts/iconfont.json

3. 多字体支持

// 不同的图标集使用不同的类
Icon(UiIcons.home)      // UI图标
Icon(BrandIcons.logo)   // 品牌图标

4. 动态图标选择

// 根据条件选择图标
final iconData = condition ? IconFont.home : IconFont.userCircle;
Icon(iconData)// 从配置中选择图标
final iconName = config['icon_name'];
final iconData = IconFont.getByName(iconName);
if (iconData != null) {Icon(iconData)
}

🔧 常见问题

Q: 生成的图标不显示?

A: 检查 pubspec.yaml 中的字体配置是否正确,字体家族名称要与生成的代码一致。

Q: 图标显示为方块?

A: 确保字体文件路径正确,并且字体文件包含对应的Unicode字符。

Q: 命名冲突怎么办?

A: 工具会自动处理大部分命名冲突,如果仍有问题,可以修改原始JSON中的 font_class 名称。

Q: 支持自定义JSON格式吗?

A: 支持多种格式,工具会自动识别常见的字段名(font_classnameunicode_decimalcode等)。

Q: 如何更新图标?

A: 重新下载JSON文件,然后重新运行生成命令即可。

📚 完整工作流程

  1. 从 iconfont.cn 下载图标

    • 选择图标并加入购物车
    • 下载代码,获取 iconfont.jsoniconfont.ttf
  2. 放置文件

    assets/
    └── fonts/├── iconfont.json└── iconfont.ttf
    
  3. 配置 pubspec.yaml

    flutter:fonts:- family: ComIconfonts:- asset: assets/fonts/iconfont.ttf
    
  4. 生成代码

    flutter_chen_iconfont
    
  5. 在代码中使用

    import 'generated/iconfont.dart';Icon(IconFont.home)
    

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

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

相关文章

【MATLAB】(二)基础知识

一.MATLAB命令1.指令行“头首”的 “>>” 是 “指令输入提示符” &#xff0c;它是自动输入的。“>>” 为运算提示符&#xff0c;表示MATLAB处于准备就绪状态。如在提示符后输入一条命令或一段程序后按Enter键&#xff0c;MATLAB将给出对应的结果&#xff0c;并将结…

Day36| 1049. 最后一块石头的重量 II、494.目标和、474.一和零

文章链接 1049. 最后一块石头的重量 II 解题关键&#xff1a;找到重量和尽量相等的两堆 确定dp数组以及下标的含义 dp[j]表示容量&#xff08;这里说容量更形象&#xff0c;其实就是重量&#xff09;为j的背包&#xff0c;最多可以背最大重量为dp[j]。 确定递推公式 01背包…

【A*/BFS】P5507 机关

# P5507 机关 题目描述 这扇门上有一个机关&#xff0c;上面一共有12个旋钮&#xff0c;每个旋钮有4个状态&#xff0c;将旋钮的状态用数字111到444表示 每个旋钮只能向一个方向旋转&#xff08;状态&#xff1a;1->2->3->4->1&#xff09;&#xff0c;在旋转时&am…

终结集成乱局:模型上下文协议(MCP)如何重构AI工具生态?

AI 助手正处于能力发展的初级阶段。它们擅长处理独立任务——例如解析 PDF、编写 SQL 语句、等等——但当你要求它们在 Slack、Gmail 和 Jira 等平台间协同操作时&#xff0c;整个流程就变得异常复杂且脆弱&#xff0c;如同调试一套由众多 API 密钥串联的精密机械&#xff08;鲁…

谈谈毕业工作一年后的变化

文章目录谈谈毕业工作一年后的变化工作篇生活篇谈谈毕业工作一年后的变化 工作篇 2025.7.30 21:49 呼~再次打开这个网站发布文章&#xff0c;是多么陌生。仿佛有说不完的话&#xff0c;但如今时间却不允许我无限制的长篇大论的写下去了。 先说下工作吧。 毕业后工作好快啊&…

huggingface下载问题

国内使用git clone下载huggingfaceTOC 国内直接git clone连接不上问题 git clone https://huggingface.co/spaces/ZebangCheng/Emotion-LLaMA Cloning into ‘Emotion-LLaMA’… fatal: unable to access ‘https://huggingface.co/spaces/ZebangCheng/Emotion-LLaMA/’: Fai…

anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package

conda issuehttp://t.csdnimg.cn/ndZZK 目录 常规安装 检索包资源 获取指定包的安装源&安装指令 安装指定包 常规安装 conda 常规安装xxx包 conda install xxx conda install有可能会受限于channel导致报错PackagesNotFoundError: The following packages are not av…

python cli命令 cli工具命令 自定义cli命名 开发 兼容 window、mac、linux,调用示例

前言需求背景整个项目基于Python开发&#xff0c;需求方期望不直接调用Python脚本执行&#xff0c;希望封装为cli命令执行Python脚本&#xff0c;使其更为简单而又“优雅”。类似直接使用 adb devices 的方式直接调用运行&#xff0c;而不是 python adbToolls.py devices的方式…

k8s pod生命周期、初始化容器、钩子函数、容器探测、重启策略

pod结构Pause容器 Pause容器是每个Pod都会有的一个根容器&#xff0c;它的作用有两个 可以以它为根据&#xff0c;评估整个pod的健康状态可以在根容器上设置IP地址&#xff0c;其他容器都以此IP&#xff08;Pod IP&#xff09;&#xff0c;以实现Pod内部的网络通信&#xff0c;…

Redis:缓存雪崩、穿透、击穿的技术解析和实战方案

&#x1f6a8; 1、简述 随着系统规模扩大&#xff0c;Redis 缓存被广泛用于数据预热、热点数据防护和高并发系统优化。然而在高并发环境中&#xff0c;缓存雪崩、穿透、击穿等问题若处理不当&#xff0c;可能导致系统雪崩式崩溃。 本文从原理、原因出发&#xff0c;结合实际项目…

前端-html+CSS基础到高级(二)html基础

一、 为什么需要Web标准 浏览器差异问题&#xff1a;五大主流浏览器&#xff08;IE、Chrome、Firefox、Safari等&#xff09;使用不同渲染引擎&#xff0c;导致相同代码解析效果存在差异。为什么需要Web标准&#xff1f;不同浏览器的渲染引擎不同&#xff0c;对于相同代码解析的…

前端-移动Web-day2

目录 1、空间-平移 2、视距 3、空间旋转-Z轴 4、空间旋转-X轴 5、空间旋转-Y轴 6、立体呈现 7、案例-3D导航 8、空间-缩放 9、动画-体验 10、动画-实现步骤 11、animation复合属性 12、animation拆分写法 13、案例-走马灯 14、精灵动画 15、多组动画 16、案例-…

力扣1116题:用C++实现多线程交替输出零、偶数、奇数

一、题目解读 力扣1116题要求设计一个类&#xff0c;实现三个线程交替输出数字&#xff1a;一个线程输出连续的0&#xff0c;一个线程输出连续的偶数&#xff0c;另一个线程输出连续的奇数。输入参数n为总输出次数&#xff08;每个线程各输出n次&#xff09;&#xff0c;输出需…

C语言(07)——原码 补码 反码 (超绝详细解释)

本文的内容通下面这篇文章有着紧密的联系&#xff0c;读者可以选择性阅读 C语言————二、八、十、十六进制的相互转换-CSDN博客 相关的C语言练习题和思维锻炼可以参考以下文章 C语言————练习题册&#xff08;答案版&#xff09;-CSDN博客 C语言————斐波那契数列…

磁盘坏道检测工具在美国服务器硬件维护中的使用规范

磁盘坏道检测工具在美国服务器硬件维护中的使用规范在服务器硬件维护领域&#xff0c;磁盘坏道检测工具是保障数据安全的第一道防线。本文将系统介绍美国数据中心环境下专业级磁盘诊断方案的实施标准&#xff0c;重点解析SMART检测、坏道修复算法与自动化运维流程的整合方法&am…

【n8n】如何跟着AI学习n8n【03】:HTTPRequest节点、Webhook节点、SMTP节点、mysql节点

前言 n8n的系统性学习&#xff0c;对各知识点地毯式学习&#x1f50d;~ 前面课程 定制n8n的AI老师&#xff0c;有AI老师制定学习大纲&#xff0c;参考之前的文档&#xff08;本系列n8n学习大纲&#xff0c;也在这里&#xff09;&#xff1a; 【n8n】如何跟着AI学习n8n_01&a…

Vue 的双向数据绑定原理

Vue 的双向数据绑定是通过 数据劫持 发布-订阅模式 实现的&#xff0c;具体分为以下三个关键机制&#xff1a;1. 数据劫持&#xff08;响应式系统&#xff09; Vue 使用 Object.defineProperty&#xff08;Vue 2&#xff09;或 Proxy&#xff08;Vue 3&#xff09;监听数据变化…

【基于C# + HALCON的工业视觉系统开发实战】三十五、金属表面划伤检测:强反光场景解决方案

摘要:针对金属表面强反光导致划伤检测准确率低的行业痛点,本文提出基于光度立体法的工业视觉检测方案。系统采用“硬件抗反光+算法重建”双策略,硬件上通过可编程分区环形光源、偏振镜头与高动态相机构建成像系统;算法上利用四方向光源序列图像重建表面法向量与高度场,实现…

为什么bert是双向transformer

BERT 是双向 Transformer&#xff0c;这是它的一个核心创新点。下面我从 技术原理、与传统 Transformer 的区别、以及双向性的实际意义 来详细解释为什么 BERT 被称为“双向 Transformer”。一、什么是 BERT 的“双向”&#xff1f;在 BERT 的论文中&#xff0c;双向的原文是 &…

vue中使用Canvas绘制波形图和频谱图(支持.pcm)

实现方式一&#xff1a; vue中使用wavesurfer.js绘制波形图和频谱图 安装colorMap&#xff1a; npm install --save colormap1、单个频谱图 效果&#xff1a; 源码&#xff1a; <template><div class"spectrogram-container"><canvas ref"ca…