loadFont static method
动态加载全局字体,如果加载成功则返回true
注意:此函数不会更新你的页面,你应当使用状态管理保存当前选中的字体,
每次加载完字体后通过FontUtil.fontFamily变量更新你的状态
Implementation
static Future<bool> loadFont([FontModel? fontModel]) async {
fontModel ??= GlobalFontPreset.systemFont;
// 如果加载的fontUrl、fontWeights都为空,则那么跳过网络解析
if (fontModel.fontUrl == null &&
(fontModel.fontWeights == null || fontModel.fontWeights!.isEmpty)) {
_currentFontModel.value = fontModel;
localStorage.setItem(_localKey, jsonEncode(fontModel.toJson()));
_loadFonts.add(fontModel.fontFamily);
return true;
} else {
List<String> fontFamilyList = [];
List<ByteData> fontByteDataList = [];
if (fontModel.fontUrl != null) {
// 如果当前字体已加载,那么跳过网络解析
if (!_loadFonts.contains(fontModel.fontFamily)) {
var result = await generalLoadNetworkFont(fontModel.fontUrl!);
// 加载网络字体失败,返回false结束运行
if (result == null) return false;
fontFamilyList.add(fontModel.fontFamily);
fontByteDataList.add(result);
}
} else {
List<int> needLoadFonts = [];
for (int key in fontModel.fontWeights!.keys) {
if (!_loadFonts.contains('${fontModel.fontFamily}_$key')) {
needLoadFonts.add(key);
}
}
var result = await Future.wait(
needLoadFonts.map(
(key) => generalLoadNetworkFont(
fontModel!.fontWeights![key]!,
fontModel: fontModel,
localKey: '${fontModel.fontFamily}_$key',
),
),
);
if (result.contains(null)) return false;
fontFamilyList.addAll(
needLoadFonts.map((key) => '${fontModel!.fontFamily}_$key'),
);
fontByteDataList.addAll(result.cast<ByteData>());
}
// 注入字体失败,返回false结束运行
if (!(await _loadFont(fontModel.fontFamily, fontByteDataList))) {
return false;
}
_currentFontModel.value = fontModel;
localStorage.setItem(_localKey, jsonEncode(fontModel.toJson()));
_loadFonts.addAll(fontFamilyList);
return true;
}
}