通过 iconfont 实现 Flutter 展示 SVG 图标

902 阅读2分钟

故事的起因是因为公司的 Flutter 项目用到了和风天气接口,接口返回会带有和风天气自带的数字 Icon 标识,通过和风天气图标库来解析图标,但是官方图标库只提供了 Web 端的运行实例,好在是同时提供了已经生成好的全部图标。

image.png

下载后会发现文件有很多 svg 构成,在引入 flutter_svg svg 展示插件时,由于 Flutter SDK 版本过低,无法使用。

最终找到的解决方案是通过使用 iconfont+ 来生成字体文件,并通过 Icon 小部件来实现展示。

通过 Iconfont+ 上传 svg 或选取图标库的现有图标,生成对应的字体文件。

image.png

点击右上角的购物车,然后点击添加至项目,如下图:

image.png

创建好后加入此项目,跳转到我的项目页面,点击下载,如下图:

image.png

得到字体文件后,需要首先配置 pubspec.yaml ,在 Flutter 默认创建的项目中可以使用系统 Material 图标

flutter:
  uses-material-design: true

选择iconfont.ttf文件拷贝到 Flutter 项目的assets/fonts目录下,assets/fonts目录默认是没有的,需要手动创建,在pubspec.yaml设置如下:

fonts:
- family: Qweather
  fonts:
    - asset: assets/ttf/hotel/weather-icons.ttf

在生成字体时,IconFont+ 会自动对图标创建对应的 Unicode 编码,在我的项目中,对应的图标下方会有对应生成的 Unicode 编码。

image.png

其中0xe613在下载图标时已经标注,将&#替换为0

在 Flutter 中调用:

Icon(IconData(0xe613,fontFamily: 'appIconFonts')

但实际生成的标注在现有项目中不能直接使用,需要通过接口返回的 Icon 处理对应的标注值,和风天气项目中自带了以 Icon 的值命名的图标明,通过简单的 JS 脚本就可以快速生成对应解释文件。

list =  document.getElementsByClassName("block-icon-list")[1].childNodes
var result = '';
for(var i of list) {
	var title = i.childNodes[1].title.split("-")[0];
	var value = i.childNodes[2].title.replace("&#", "0").replace(";","")
	result += title + ":" + value + ","
}

最后创建对应的常量就可以实现调用了

image.png

Icon(IconData(weatherIconConst[weatherIcon]!, fontFamily: FontFamily.Weather.name)