故事的起因是因为公司的 Flutter 项目用到了和风天气接口,接口返回会带有和风天气自带的数字 Icon 标识,通过和风天气图标库来解析图标,但是官方图标库只提供了 Web 端的运行实例,好在是同时提供了已经生成好的全部图标。
下载后会发现文件有很多 svg 构成,在引入 flutter_svg svg 展示插件时,由于 Flutter SDK 版本过低,无法使用。
最终找到的解决方案是通过使用 iconfont+ 来生成字体文件,并通过 Icon 小部件来实现展示。
通过 Iconfont+ 上传 svg 或选取图标库的现有图标,生成对应的字体文件。
点击右上角的购物车,然后点击添加至项目,如下图:
创建好后加入此项目,跳转到我的项目页面,点击下载,如下图:
得到字体文件后,需要首先配置 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 编码。
其中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 + ","
}
最后创建对应的常量就可以实现调用了
Icon(IconData(weatherIconConst[weatherIcon]!, fontFamily: FontFamily.Weather.name)