Flutter动态加载设置字体
Flutter学习簿
共 4642字,需浏览 10分钟
· 2021-02-21
Flutter 有好多关于设置字体样式的教程,官网上就有,但好多都是把字体放到 assets 资源包,指定加载,这样会让 App 的包超级大不说,字体加载还死板。今天介绍一种动态加载字体的教程。
其实也超级简单,核心代码就几句:
// 构建 loader
var fontLoader = FontLoader('family');
// 获取字体 (Future
) 装载到 loader fontLoader.addFont(fetchFontByteData());
// 加载字体
await fontLoader.load();
下面稍微介绍一下其用法:
代码目录结构
模拟从手机应用中获取到文件字体并加载
思路: 用文件选择器找到字体文件路径,生成 file 并转为 ByteData,进行加载。就这么简单。核心代码如下:
void _loadFontFile() async {
//字体路径
String FontPath =
"/Users/huangsir/Documents/Flutter/flutter_font_app/assets/繁体中文.ttf";
var fontLoader = FontLoader("testFamily1"); //此处设置的名字需和使用时指定的family一致
//获取本地字体
File fontFile = File(FontPath);
Uint8List bytes = fontFile.readAsBytesSync();
fontLoader.loadFont(bytes, "testFamily1");
await fontLoader.load().catchError((e) {
print("loadFontFile erro: $e");
});
print("加载成功");
_fontFamily = "testFamily1";
setState(() {});
}
获取 Asset 字体文件
//获取Asset字体文件
void _loadFontFile1() async {
var fontLoader = FontLoader('testFamily2');
fontLoader.addFont(fetchFontByteData());
await fontLoader.load().catchError((e) {
print("loadFontFile erro: $e");
});
_fontFamily = "testFamily2";
setState(() {});
}
//此处的byte 数据也可以从网上下载获取,实现网上下载替换字体
Future
fetchFontByteData() => rootBundle.load('assets/行楷.ttf');
fetchFontByteData()就是获取 Future
应用
TextStyle 里面有一个 fontFamily 属性,可以用_fontFamily 字段接收,设置 TextStyle 即可。
Text('如果这世界复杂,虚假,喧哗',
style: TextStyle(
fontSize: 16,
fontFamily: _fontFamily,
color: Theme.of(context).primaryColor),
)
效果
现实应用
现实 App 中替换字体大部分都是全局,即整个 App 的字体都会替换。这种实现思路就是用 Redux 或者其他状态管理替换 MaterialApp 中 ThemeData 的 fontFamily 属性,即可实现整个 App 字体切换。
MaterialApp(
...
theme: ThemeData(
fontFamily: _fontFamily,
),
home: HomePage(),
)
全部代码
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: '字体动态加载',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: '字体加载'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
//接收设置字体样式
String _fontFamily;
void initState() {
// TODO: implement initState
super.initState();
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children:
[ Text(
'如果这世界复杂,虚假,喧哗',
style: TextStyle(
fontSize: 16,
fontFamily: _fontFamily,
color: Theme.of(context).primaryColor),
),
RaisedButton(
onPressed: () {
//模拟加载字体文件
_loadFontFile();
},
child: Text("模拟获取本地字体文件"),
),
RaisedButton(
onPressed: () {
//模拟加载字体文件
_loadFontFile1();
},
child: Text("获取Assets字体文件"),
)
],
),
), //
);
}
//现实运用中肯定是从手机中读取到字体文件导入,此处模拟获取本地字体文件,
void _loadFontFile() async {
//字体路劲
String FontPath =
"/Users/huangsir/Documents/Flutter/flutter_font_app/assets/繁体中文.ttf";
var fontLoader = FontLoader("testFamily1"); //此处设置的名字需和使用时指定的family一致
//获取本地字体
File fontFile = File(FontPath);
Uint8List bytes = fontFile.readAsBytesSync();
fontLoader.loadFont(bytes, "testFamily1");
await fontLoader.load().catchError((e) {
print("loadFontFile erro: $e");
});
print("加载成功");
_fontFamily = "testFamily1";
setState(() {});
}
//获取Asset字体文件
void _loadFontFile1() async {
var fontLoader = FontLoader('testFamily2');
fontLoader.addFont(fetchFontByteData());
await fontLoader.load().catchError((e) {
print("loadFontFile erro: $e");
});
_fontFamily = "testFamily2";
setState(() {});
}
//此处的byte 数据也可以从网上下载获取,实现网上下载替换字体
Future
fetchFontByteData() => rootBundle.load('assets/行楷.ttf');}
评论
手动部署jar包,太low!动态上传热部署真爽!
本文来源:https://blog.csdn.net/zhangzhiqiang_0912近期开发系统过程中遇到的一个需求,系统给定一个接口,用户可以自定义开发该接口的实现,并将实现打成jar包,上传到系统中。系统完成热部署,并切换该接口的实现。定义简单的接口这里以一个简单的计算器功能为例,接口定义
Java高效学习
10
实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达导 读 本文主要介绍基于YOLOv9+SAM实现动态目标检测和分割,并给出详细步骤和代码。 背景介绍 &nb
小白学视觉
10
炫技Groovy!SpringBoot中的动态编程实战
来源:juejin.cn/post/7139877924676567048👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
10
在pycharm里边怎么设置代码背景图的?
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤君问归期未有期,巴山夜雨涨秋池。大家好,我是Python进阶者。一、前言前几天在Python白银交流群【Kim】问了一个Python问题,然后他发出来的代码如下图所示:可以看到代码中有背
Python爬虫与数据挖掘
4
SpringBoot 实现动态插拔的 AOP,就变得有趣多了
大家好,我是小富~现在有这么一个需求:就是我们日志的开与关是交给使用人员来控制的,而不是由我们开发人员固定写死的。大家都知道可以用aop来实现日志管理,但是如何动态的来实现日志管理呢?aop源码中的实现逻辑中有这么一个步骤,就是会依次扫描Advice的实现类,然后执行。我们要做的就是自定义一个adv
程序员内点事
10
性能优化——图片压缩、加载和格式选择
大厂技术 高级前端 Node进阶点击上方 程序员成长指北,关注公众号回复1,加入高级Node交流群前言相信大家都听说过 "258 原则(https://blog.csdn.net/weixin_42139375/article/details/8
程序员成长指北
10
CVPR 2024满分论文解读:基于可变形三维高斯的高质量单目动态重建新方法
来源:机器之心本文约2200字,建议阅读7分钟这是首个使用变形场将 3D 高斯拓展到单目动态场景的工作。单目动态场景(Monocular Dynamic Scene)是指使用单眼摄像头观察并分析的动态环境,其中场景中的物体可以自由移...
数据派THU
0
电子书丨《期权新世界:解读期权动态调整与策略实战》
▊《期权新世界:解读期权动态调整与策略实战》Jack 陈竑廷 著电子书售价:49.5元2020年07月出版这是一本讲解灵活应用期权的实战书,建立在作者多年的投资实战的基础上,从独特的角度解析期权,并一步步带领读者...
博文视点Broadview
0