- 前言
Flutter作为时下最流行的技术之一,凭借其出色的性能以及抹平多端的差异优势,早已引起大批技术爱好者的关注,甚至一些闲
鱼,美团,腾讯等大公司均已投入生产使用。虽然目前其生态还没有完全成熟,但身靠背后的Google加持,其发展速度已经足够惊
人,可以预见将来对Flutter开发人员的需求也会随之增长。
无论是为了现在的技术尝鲜还是将来的潮流趋势,都9102年了,作为一个前端开发者,似乎没有理由不去尝试它。正是带着这样的
心理,笔者也开始学习Flutter,同时建了一个用于练习的仓库,后续所有代码都会托管在上面,欢迎star,一起学习。这是我写的
Flutter系列文章:
用Flutter构建漂亮的UI界面 – 基础组件篇
Flutter滚动型容器组件 – ListView篇
Flutter网格型布局 – GridView篇
在Flutter中使用自定义Icon
今天要分享的内容其实非常简单,我们都知道Flutter内置了一套Material Design风格的Icon图标,但对于一个成熟的App而言,通
常情况下还是远远不够的。为此,我们需要在项目中引入自定义的Icon图标。
本文就将以Ant Design图标库为例,介绍如何在Flutter中引入自定义图标。 - 准备工作:字体文件
正所谓“巧妇难为无米之炊”,要想引入自定义图标,首先我们得准备好图标字体文件(.ttf后缀)。对于大公司而言,找视觉同学切
就可以了。但如果是自己做的业余项目或者没有资源的时候,我们可以上阿里巴巴矢量图标库pick自己心仪的图标。
这里就以Ant Design官方图标库为例(一共有600个图标),通过以下操作,我们将图标字体文件加入到项目中:
添加购物车 –> 点击购物车 –> 下载代码 –> 解压 –> 拷贝至项目(可重命名)
- 声明自定义字体
仅仅将字体文件复制到项目中还不够,我们需要通过声明的方式来告诉Flutter有新字体可用。打开项目根目录下的pubspec.yaml文
件,找到fonts这一段:
To add custom fonts to your application, add a fonts section here, in this “flutter” section. Each entry in this list should have a
“family” key with the font family name, and a “fonts” key with a list giving the asset and other descriptors for the font.
注释就是让我们在该段文字下方添加自定义字体的声明,结合其注释掉的例子和当前的项目目录,我们可以这样配置:
/
项目工程目录结构
.
├── README.md
├── android
│ └── app
├── assets
│ └── fonts
│ └── AntdIcons.ttf
├── flutter_training_app.iml
├── ios
│ └── Flutter
├── lib
│ └── main.dart
├── pubspec.lock
└── pubspec.yaml
字体声明
fonts:
- family: AntdIcons
fonts: - asset: assets/fonts/AntdIcons.ttf
注意: 配置完之后,一定要执行flutter packages get命令以及重新编译项目,否则字体文件无法使用。
- 编写自定义的IconData
其实到目前为止,我们已经可以使用刚刚下载的图标了,就像下面代码这样:
Icon(
IconData(0xe77d, fontFamily: ‘AntdIcons’),
size: 20,
color: Colors.black
)
其中fontFamily的值’AntdIcons’就是我们刚才声明的新字体,但是代码中的0xe77d数值是哪来的呢?再次打开之前下载解压之后的文
件夹,其中有一个demo_index.html文件,在浏览器中打开它我们可以看到下面的画面:
在Unicode这个Tab下,我们可以看到它贴心地给出了所有图标的Type和Unicode码对照关系。所以理论上来说,我们想用哪个图标,
只要copy其Unicode码到代码中就可以了。
/
不过,这种做法显然不是很友好。首先,我们每次使用Icon之前都要从这张关系表中查找;其次,你确定下次代码中看到这串数字是
对应什么图标吗(更不用说其他人了)?所以,我们需要更优雅的方法来管理自定义图标。
其实做法也简单,我们可以创建一个自定义图标的类:
class AntdIcons {
static const IconData checkCircle = IconData(0xe77d, fontFamily: ‘AntdIcons’);
static const IconData CI = IconData(0xe77e, fontFamily: ‘AntdIcons’);
static const IconData Dollar = IconData(0xe77f, fontFamily: ‘AntdIcons’);
…
}
然后使用方法就变成了:
Icon(
AntdIcons.checkCircle,
size: 20,
color: Colors.black
)
以上代码完全等同于前面直接使用Unicode码的效果。不过要想用上所有的图标,我们还得丰富AntdIcons这个类。为此,可以写上一
段小脚本,在demo_index.html浏览器窗口的控制台中运行就能得到定义IconData的代码:
function camelCase(str) {
return str.replace(/[ -]+(\w)/g, (match, char) => char.toUpperCase());
}
function makeCode({name, code}) {
return static const IconData ${camelCase(name)} = IconData(0${code.substr(2, 5)}, fontFamily: 'antd-icons');\n
;
}
Array
.from(document.querySelectorAll(‘.unicode .dib’))
.map(element => {
return {
name: element.querySelector(‘.name’).innerText,
code: element.querySelector(‘.code-name’).innerText
};
})
.map(makeCode)
.join(‘\n’);
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=7227,转载请注明出处。
评论0