ImageCache 和 ImageProvider 變更
摘要
#ImageCache
現在有一個名為 containsKey
的方法。 ImageProvider
子類別不應覆寫 resolve
,而應在 ImageProvider
上實作新的方法。這些變更作為單一提交合併到框架中。
變更說明
#以下章節說明 containsKey
和 ImageProvider
的變更。
containsKey 變更
#ImageCache
的客戶端,例如自訂的 ImageProvider
,可能想知道快取是否已在追蹤某個圖片。加入 containsKey
方法可讓呼叫者在不呼叫像 putIfAbsent
這樣的方法的情況下發現這一點,putIfAbsent
可能會觸發對 ImageProvider.load
的不必要呼叫。
預設實作會檢查待處理和快取的圖片儲存區。
bool containsKey(Object key) {
return _pendingImages[key] != null || _cache[key] != null;
}
ImageProvider 變更
#ImageProvider.resolve
方法會執行一些複雜的錯誤處理工作,通常不應覆寫。它之前也會透過 ImageProvider.obtainKey
和 ImageProvider.load
將圖片載入圖片快取。子類別如果沒有覆寫 resolve
,就沒有機會覆寫此行為,並且如果多個 ImageProvider
都希望覆寫 resolve
,則組成 ImageProvider
的能力會受到限制。
為了解決這個問題,resolve
現在被標記為非虛擬的,並且新增了兩個受保護的新方法:createStream()
和 resolveStreamForKey()
。這些方法允許子類別控制 resolve
的大部分行為,而無需複製所有錯誤處理工作。它還允許組成 ImageProvider
的子類別更確信到各個鏈式供應商只有一個公開的進入點。
遷移指南
#ImageCache 變更
#在遷移之前,程式碼不會覆寫 containsKey
。
遷移後的程式碼
class MyImageCache implements ImageCache {
@override
bool containsKey(Object key) {
// Check if your custom cache is tracking this key.
}
...
}
ImageProvider 變更
#遷移前的程式碼
class MyImageProvider extends ImageProvider<Object> {
@override
ImageStream resolve(ImageConfiguration configuration) {
// create stream
// set up error handling
// interact with ImageCache
// call obtainKey/load, etc.
}
...
}
遷移後的程式碼
class MyImageProvider extends ImageProvider<Object> {
@override
ImageStream createStream(ImageConfiguration configuration) {
// Return stream, or use super.createStream(),
// which returns a new ImageStream.
}
@override
void resolveStreamForKey(
ImageConfiguration configuration,
ImageStream stream,
Object key,
ImageErrorListener handleError,
) {
// Interact with the cache, use the key, potentially call `load`,
// and report any errors back through `handleError`.
}
...
}
時間軸
#已於版本中加入:1.16.3
在穩定版發布:1.17
參考資料
#API 文件
相關問題
相關 PR
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面最後更新於 2024-04-04。 檢視原始碼 或 回報問題。