Flutter自带了Material的图标,但是还是不太适合中国的国情,比如微信、微博、QQ这些国内常用的图标就没有收录,或者为了让APP更有个性,我们希望换掉Material的风格,这个时候,自定义图标就成了一个不大不小的问题,Flutter对于引用自定义的解决思路其实不太复杂,按照以下思路走就可以了:
把图标打包成ttf文件放在项目路径下并且修改pubspec.yaml文件,比如:
fonts:
- family: MyIcons
fonts:
# 字体文件所在的路径+文件名
- asset: assets/fonts/MyIcons.ttf
然后添加一个.dart文件,我习惯按font family名字命名为my_icons.dart(注意文件名要符合dart的代码规范),代码内容如下:
import 'package:flutter/widgets.dart';
class MyIcons {
CustomIcons._();
static const _kFontFam = 'MyIcons';
static const _kFontPkg = null;
static const IconData weibo = IconData(0xf18a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData qq = IconData(0xf1d6, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData wechat = IconData(0xf1d7, fontFamily: _kFontFam, fontPackage: _kFontPkg);
}
上述代码有两点需要特别注意:
_kFontFam这个私有变量要和pubspec.yaml的family的名称一致,
IconData第一个参数是codePoint,记得要图标在字体内的Unicode代码一致
设置好了就可以开始使用了,以下是一个例子:
import './assets/my_icons.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Custom Icon Demo',
home: Scaffold(
appBar: AppBar(
title: Text('Login with WeChat'),
),
body: Center(
child: Icon(MyIcons.wechat), //重点在这里
),
),
);
}
}
...其实还有更省力的办法
我说的不是.ttf文件的难题,但是对于Flutter,这还远远不够,我说的是
新建我的图标集:
打开网站,在Names中搜索或点击图标进行选择,目前可以选择的图标集有
Material\Font Awesome 5\Entypo\Typicons\Iconic\Modern Pictograms\Meteocons\MFG Labs\Maki\Zocial\Brandico\Elusive\Linecons\Web Symbols\Linearicons Free\Octicons\RPG Awesome,如果没有的话,也可以自行上传SVG
点完餐后点击Download下载压缩包,解压,找到字体文件和.dart文件,拷贝到你的Flutter项目路径下,参考前述步骤1修改pubspec.yaml文件,参考步骤3引用图标;
修改我的图标集
fluttericon是个纯前端的网站,那么我之前的图标集怎么找的回来呢,这就需要你好好保管好之前下载的压缩包,重新上传到网站就可以找回并修改你的图标集了。