动态缓存字体

一个可定制的Flutter动态字体加载器,支持缓存。也支持Firebase Cloud Storage!

demo3

简介

动态缓存字体允许您从任何URL动态加载字体并进行缓存。这样,您可以减小包大小,并在需要时加载字体。

动态加载字体的另一个优点是,您现在可以轻松地为用户提供选择应用字体的选项。这提供了更高的定制性。

缓存是额外的性能升级,因为字体只会下载一次并多次使用,从而减少了网络和电池的使用。

开始使用

要使用该包,请在pubspec.yaml文件中将dynamic_cached_fonts添加为依赖项。

用法

按需加载字体

您可以按需加载字体,例如-当页面加载时

@override
void initState() {
  final DynamicCachedFonts dynamicCachedFont = DynamicCachedFonts(
    fontFamily: fontFamilyName, // The font family name to be passed to TextStyle.fontFamily
    url: fontUrl, // A valid url pointing to a font file (.ttf or .otf files only) 
  );
  dynamicCachedFont.load(); // Downloads the font, caches and loads it.

  super.initState();
}
...
Text(
  'Some Text',
  style: TextStyle(fontFamily: fontFamilyName),
)

demo1

或者当按钮被点击时

ElevatedButton(
  onPressed: () {
    final DynamicCachedFonts dynamicCachedFont = DynamicCachedFonts(
      fontFamily: fontFamilyName,
      url: fontUrl,
    );

    dynamicCachedFont.load();
  },
  child: const Text('Load Font'),
),

demo2

如果您想更改缓存的大小,或者字体在缓存中保留多长时间,请传入maxCacheObjectscacheStalePeriod

DynamicCachedFonts(
  fontFamily: fontFamilyName,
  url: fontUrl,
  maxCacheObjects: 150,
  cacheStalePeriod: const Duration(days: 100),
);

TextStyle.fontFamily仅在调用load()后应用。

多次调用load()会抛出StateError

如果您需要加载多个不同粗细和样式的字体,作为单个字体系列,该怎么办?为此,您可以使用DynamicCachedFonts.family构造函数。

它接受一个指向同一字体系列中不同字体的URL列表,作为urls

DynamicCachedFonts.family(
  urls: <String>[
    fontFamilyNameBoldUrl,
    fontFamilyNameItalicUrl,
    fontFamilyNameRegularUrl,
    fontFamilyNameThinUrl,
  ],
  fontFamily: fontFamilyName,
);

demo5

如果您需要更多控制,请使用静态方法!

cacheFont

onPressed: () {
  DynamicCachedFonts.cacheFont(fontUrl);
},
child: const Text('Download font'),

您也可以在此处传入maxCacheObjectscacheStalePeriod

canLoadFont, loadCachedFont, loadCachedFamily

canLoadFont用于检查字体是否在缓存中可用。它通常与加载器结合使用。

首先,检查字体是否已在缓存中。如果在,则加载字体。

if(DynamicCachedFonts.canLoadFont(fontUrl)) {
  // To load a single font...
  DynamicCachedFonts.loadCachedFont(
    fontUrl,
    fontFamily: fontFamilyName,
  );

  // Or if you want to load multiple fonts as a family...
  DynamicCachedFonts.loadCachedFamily(
    <String>[
      fontFamilyNameBoldUrl,
      fontFamilyNameItalicUrl,
      fontFamilyNameRegularUrl,
      fontFamilyNameThinUrl,
    ],
    fontFamily: fontFamilyName,
  );
}

现在,如果缓存中没有字体,则下载它。

if(DynamicCachedFonts.canLoadFont(fontUrl)) {
  ...
} else {
  DynamicCachedFonts.cacheFont(fontUrl);
}

removeCachedFont

要从缓存中永久删除字体,请使用removeCachedFont

注意-在应用完全重启之前,这不会立即更改字体。

demo3

最后,如果您想自定义实现,可以扩展RawDynamicCachedFonts并覆盖静态方法。

想从Firebase Cloud Storage加载自定义字体?选择DynamicCachedFonts.fromFirebase构造函数!它接受一个以gs://开头的Google Cloud Storage位置URL。除此之外,它与默认构造函数类似。

提示:除了load()之外,所有方法都有一个名为verboseLog的参数,用于记录详细的状态和配置以进行调试。

demo4

GitHub

https://github.com/sidrao2006/dynamic_cached_fonts