Flutter Chen Generator - IconFont Generator

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…