loadFont static method

Future<bool> loadFont([
  1. FontModel? fontModel
])

动态加载全局字体,如果加载成功则返回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;
  }
}