Flutter图标字体生成插件icon_font_generator的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter图标字体生成插件icon_font_generator的使用

概述

icon_font_generator 包提供了一种简单的方法,可以将SVG图标转换为OpenType字体,并生成与Flutter兼容的类,该类包含图标的标识符(类似于 CupertinoIconsIcons 类)。这个包完全用Dart编写,不需要任何外部依赖,兼容dart2js和dart2native。

字体生成

安装开发依赖

$ flutter pub add --dev icon_font_generator

# 然后运行:
$ flutter pub run icon_font_generator:generate <input-svg-dir> <output-font-file> [options]

全局激活包

$ pub global activate icon_font_generator

# 然后运行:
$ icon_font_generator <input-svg-dir> <output-font-file> [options]

必要的位置参数

  • <input-svg-dir>:包含.svg文件的输入目录路径。
  • <output-font-file>:输出字体文件路径,应具有.otf扩展名。

Flutter类选项

  • -o--output-class-file=<path>:包含图标标识符的Flutter兼容类的输出路径。
  • -c--class-name=<name>:生成类的名称。
  • -p--package=<name>:提供字体的包的名称。用于通过包依赖提供字体。
  • --[no-]format:格式化生成的Dart代码。

字体选项

  • -f--font-name=<name>:生成字体的名称。
  • --[no-]normalize:启用字体的字形规范化。如果每个图标大小和位置相同,则禁用此选项。(默认开启)
  • --[no-]ignore-shapes:禁用SVG形状到路径的转换(circle, rect等)。(默认开启)

其他选项

  • -z--config-file=<path>:icon_font_generator yaml配置文件路径。默认使用pubspec.yaml和icon_font.yaml文件。
  • -r--recursive:递归查找.svg文件。
  • -v--verbose:显示所有日志信息。
  • -h--help:显示使用信息。

使用示例

$ icon_font_generator assets/svg/ fonts/my_icons_font.otf --output-class-file=lib/my_icons.dart -r

更新Flutter项目的pubspec.yaml

flutter:
  fonts:
    - family: My Icons
      fonts:
        - asset: fonts/my_icons_font.otf

配置文件

icon_font_generator 的配置也可以放在yaml文件中。在 pubspec.yamlicon_font.yaml 文件中添加 icon_font 部分:

icon_font:
  input_svg_dir: "assets/svg/"
  output_font_file: "fonts/my_icons_font.otf"
  
  output_class_file: "lib/my_icons.dart"
  class_name: "MyIcons"
  package: my_font_package
  format: true

  font_name: "My Icons"
  normalize: true
  ignore_shapes: true

  recursive: true
  verbose: false

input_svg_diroutput_font_file 是必需的键。可以通过使用 --config-file 选项指定其他配置文件。

使用API

svgToOtfgenerateFlutterClass 函数可以用于生成字体和Flutter类。API使用的示例如下:

示例代码

import 'dart:io';
import 'package:icon_font_generator/icon_font_generator.dart';

void main() {
  const fontFileName = 'my_icons.otf';
  const classFileName = 'my_icons.dart';

  // 输入数据
  final svgMap = {
    'account_icon': '''<svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15l-5-5h10l-5 5z"/></svg>'''
  };

  // 生成字体
  final svgToOtfResult = svgToOtf(
    svgMap: svgMap,
    fontName: 'My Icons',
  );

  // 将字体写入文件
  writeToFile(fontFileName, svgToOtfResult.font);

  // 生成Flutter类
  final generatedClass = generateFlutterClass(
    glyphList: svgToOtfResult.glyphList,
    familyName: svgToOtfResult.font.familyName,
    className: 'MyIcons',
    fontFileName: fontFileName,
  );

  // 将类内容写入文件
  File(classFileName).writeAsStringSync(generatedClass);
}

注意事项

  • 生成的OpenType字体使用CFF表。
  • 生成的字体使用PostScript表(post)3.0版本,即不包含字形名称。
  • 支持的SVG元素:path, g, circle, rect, polyline, polygon, line。
  • SVG变换根据规范应用到路径。
  • SVG <g> 元素的子元素扩展到根并应用变换。与组相关的其他内容被忽略,且不支持组引用。
  • 建议使用非零填充规则。
  • ignoreShapes 设置为false时,每个SVG形状(circle, rect等)的轮廓转换为路径。注意,任何属性如"fill"或"stroke"被忽略,仅使用轮廓,因此最终字形可能与SVG图标不同。建议将SVG中的每个元素转换为路径。
  • normalize 设置为false时,建议SVG图标具有相同的高度。否则,最终结果可能不符合预期。
  • 当生成Flutter类时,静态变量名称从SVG文件名转换为Pascal命名法,并移除非允许字符。如果名称为空,则设置为’unamed’。如果名称已存在,则添加后缀 ‘_{i+1}’。

贡献

欢迎任何建议、问题和拉取请求。

许可证

MIT许可证

致谢

本软件是未维护包的分支:


希望这篇文档能帮助你更好地理解和使用 icon_font_generator 插件。如果你有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter图标字体生成插件icon_font_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图标字体生成插件icon_font_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用icon_font_generator插件来生成和使用图标字体的详细代码案例。

1. 安装插件

首先,你需要在你的pubspec.yaml文件中添加icon_font_generator插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  icon_font_generator: ^x.y.z  # 替换为最新版本号

然后运行以下命令来安装依赖:

flutter pub get

2. 准备图标字体文件

你需要一个.ttf(TrueType字体)文件,其中包含了你的图标。你可以从一些图标库(如Iconify、Font Awesome等)下载,或者使用工具(如IcoMoon)来创建自己的图标字体文件。

假设你的图标字体文件名为icons.ttf,并且你已经将它放在了assets/fonts/目录下。

3. 使用icon_font_generator生成配置文件

icon_font_generator插件可以帮助你生成一个包含图标名称和Unicode码的Dart配置文件。

首先,确保你已经安装了icon_font_generator命令行工具。你可以通过以下命令全局安装它(需要Node.js和npm):

npm install -g icon-font-generator

然后,使用以下命令生成配置文件:

icon-font-generator -i assets/fonts/icons.ttf -o assets/fonts/icons_config.dart --flutter

这个命令会在assets/fonts/目录下生成一个名为icons_config.dart的文件,该文件包含了所有图标的名称和对应的Unicode码。

4. 配置Flutter项目

pubspec.yaml中,确保你已经添加了字体文件的声明:

flutter:
  fonts:
    - family: MyIcons
      fonts:
        - asset: assets/fonts/icons.ttf

5. 使用生成的图标

现在你可以在你的Flutter项目中使用生成的图标了。以下是一个示例代码,展示了如何在你的应用程序中使用这些图标:

import 'package:flutter/material.dart';
import 'assets/fonts/icons_config.dart';  // 导入生成的配置文件

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Icon Font Generator Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(
                IconData(0xe800, fontFamily: 'MyIcons'),  // 使用生成的Unicode码
                size: 48,
                color: Colors.blue,
              ),
              SizedBox(height: 20),
              Icon(
                IconData(0xe801, fontFamily: 'MyIcons'),  // 使用另一个图标的Unicode码
                size: 48,
                color: Colors.green,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,IconData(0xe800, fontFamily: 'MyIcons')IconData(0xe801, fontFamily: 'MyIcons')分别代表你的图标字体中的两个图标。你需要根据icons_config.dart文件中生成的Unicode码来替换这些值。

总结

通过上述步骤,你已经成功地在Flutter项目中使用了icon_font_generator插件来生成和使用图标字体。这种方法可以帮助你有效地管理和使用图标,特别是在你的应用程序中包含大量图标时。

回到顶部