一种简单,易于使用但可自定义的字体加载程序,用于使用Web字体。
演示:https://sidrao2006.github.io/dynamic_cached_fonts
动态缓存字体使您可以从任何URL中动态加载字体并缓存。这样,您可以降低捆绑包的大小并加载字体,如果需要以及需要时。
动态加载字体的另一个优点是,您现在可以轻松地为用户提供选择应用字体的选项。这允许更大级别的自定义。
缓存是一种增加的性能升级,因为该字体仅下载一次并多次使用,从而减少网络和电池使用情况。
要使用软件包,请添加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),
)或单击按钮时
ElevatedButton (
onPressed : () {
final DynamicCachedFonts dynamicCachedFont = DynamicCachedFonts (
fontFamily : fontFamilyName,
url : fontUrl,
);
dynamicCachedFont. load ();
},
child : const Text ( 'Load Font' ),
),如果您想更改高速缓存的大小或字体在缓存中持续多长时间,请传递maxCacheObjects和cacheStalePeriod 。
DynamicCachedFonts (
fontFamily : fontFamilyName,
url : fontUrl,
maxCacheObjects : 150 ,
cacheStalePeriod : const Duration (days : 100 ),
); TextStyle.fontFamily s仅在调用load()后才应用。
调用
load()不止一次抛出一个StateError
如果您需要加载多个字体,具有不同的权重和样式的字体,作为一个单个家庭……为此,您可以使用DynamicCachedFonts.family constructor。
它接受了一个URL列表,指的是与urls一样的同一家庭字体。
DynamicCachedFonts . family (
urls : < String > [
fontFamilyNameBoldUrl,
fontFamilyNameItalicUrl,
fontFamilyNameRegularUrl,
fontFamilyNameThinUrl,
],
fontFamily : fontFamilyName,
);该软件包还支持将字体作为Stream加载! loadStream返回一个发出字体文件的单个订阅流。
loadStream接受回调, downloadProgressListener ,每次收到DownloadProgress事件时都称为。仅当实际上从提供的URL下载字体时,才会发生这种情况。通常从缓存提供的随后的请求不会发出任何进度事件。如果字体文件已过期,则将再次下载该文件,将其流式传输到downloadProgressListener 。
当带有单个字体URL调用loadStream时,只有将字体加载到发动机中时,就只会调用itemCountProgressListener一次。
final DynamicCachedFonts dynamicCachedFont = DynamicCachedFonts (
fontFamily : fontFamilyName,
url : fontUrl,
);
dynamicCachedFont. loadStream (
itemCountProgressListener : ( double progress, int totalItems, int downloadedItems) {},
downloadProgressListener : ( DownloadProgress progress) {},
);而且,当使用loadStream加载整个字体系列时,将为家族中的每个字体调用itemCountProgressListener一次。在下面给出的示例中, itemCountProgressListener将被称为4次,一旦将每个字体都加载到飘动的引擎中。
final DynamicCachedFonts dynamicCachedFont = DynamicCachedFonts . family (
urls : < String > [
fontFamilyNameBoldUrl,
fontFamilyNameItalicUrl,
fontFamilyNameRegularUrl,
fontFamilyNameThinUrl,
],
fontFamily : fontFamilyName,
);
dynamicCachedFont. loadStream (
itemCountProgressListener : ( double progress, int totalItems, int downloadedItems) {},
downloadProgressListener : ( DownloadProgress progress) {},
);呼叫
loadStream不止一次抛出一个StateError
如果您需要更多的控制,请使用静态方法!
cacheFont onPressed : () {
DynamicCachedFonts . cacheFont (fontUrl);
},
child : const Text ( 'Download font' ),您也可以在此处传递maxCacheObjects和cacheStalePeriod 。
canLoadFont , loadCachedFont , loadCachedFamily canLoadFont用于检查该字体是否可在缓存中可用。它通常与loadCached*方法结合使用。
首先,检查字体是否已经在缓存中。如果是,则加载字体。
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);
}cacheFontStream cacheFontStream用于下载和缓存字体。此方法类似于cacheFont ,但返回一个订阅Stream ,该流将发出下载的进度。下载将流到progressListener回调中,每次收到DownloadProgress事件时,都称为“被称为”。仅当实际上从提供的URL下载字体时,才会发生这种情况。通常从缓存提供的随后的请求不会发出任何进度事件。如果字体文件已过期,则将再次下载该文件,将其流式传输到downloadProgressListener 。
DynamicCachedFonts . cacheFontStream (
fontUrl,
progressListener : ( DownloadProgress progress) {},
);loadCachedFamilyStream使用canLoadFont检查该字体是否可在缓存中可用。
loadCachedFamilyStream用于将多个字体加载到扑动引擎中,作为单个字体系列。此方法类似于loadCachedFamily ,但返回流。
当带有单个字体URL调用loadCachedFamilyStream时,在将字体加载到发动机中时, progressListener只能调用一次。
而且,当使用loadCachedFamilyStream来加载整个字体系列时,该家族中的每一个字体都会调用progressListener一次。在下面给出的示例中, progressListener将被称为4次,一旦将每种字体加载到颤音引擎中。
DynamicCachedFonts . loadCachedFamilyStream (
< String > [
fontFamilyNameBoldUrl,
fontFamilyNameItalicUrl,
fontFamilyNameRegularUrl,
fontFamilyNameThinUrl,
],
fontFamily : fontFamilyName,
progressListener : ( double progress, int totalItems, int downloadedItems) {},
);removeCachedFont要永久从缓存中删除字体,请使用removeCachedFont 。
注意 - 直到完整的应用重新启动之前,这不会立即更改字体。
最后,如果您想自定义其实现,请扩展RawDynamicCachedFonts并覆盖静态方法。
有一个自定义字体可以从Firebase Cloud存储中加载吗?选择DynamicCachedFonts.fromFirebase构造函数!它接受Google云存储位置,该位置是从gs://开始的URL。除此之外,它类似于默认构造函数。
提示:使用
DynamicCachedFonts.toggleVerboseLogging来记录调试的详细状态和配置。
如果您找到错误,请在GitHub上打开一个问题,或者您需要任何帮助,让我们在GitHub讨论上讨论!
为了使事情变得更容易,您可以使用Docker组合来设置开发环境。只需运行docker compose run linux即可设置Linux Dev环境或Run docker compose run windows以设置Linux Dev环境。
您需要在Windows机器上设置Docker Windows环境。
为了为包装做出贡献,请分配存储库并打开拉动请求!