一種簡單,易於使用但可自定義的字體加載程序,用於使用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環境。
為了為包裝做出貢獻,請分配存儲庫並打開拉動請求!