跳到主要內容

ImageCache 和 ImageProvider 變更

摘要

#

ImageCache 現在有一個名為 containsKey 的方法。 ImageProvider 子類別不應覆寫 resolve,而應在 ImageProvider 上實作新的方法。這些變更作為單一提交合併到框架中。

變更說明

#

以下章節說明 containsKeyImageProvider 的變更。

containsKey 變更

#

ImageCache 的客戶端,例如自訂的 ImageProvider,可能想知道快取是否已在追蹤某個圖片。加入 containsKey 方法可讓呼叫者在不呼叫像 putIfAbsent 這樣的方法的情況下發現這一點,putIfAbsent 可能會觸發對 ImageProvider.load 的不必要呼叫。

預設實作會檢查待處理和快取的圖片儲存區。

dart
  bool containsKey(Object key) {
    return _pendingImages[key] != null || _cache[key] != null;
  }

ImageProvider 變更

#

ImageProvider.resolve 方法會執行一些複雜的錯誤處理工作,通常不應覆寫。它之前也會透過 ImageProvider.obtainKeyImageProvider.load 將圖片載入圖片快取。子類別如果沒有覆寫 resolve,就沒有機會覆寫此行為,並且如果多個 ImageProvider 都希望覆寫 resolve,則組成 ImageProvider 的能力會受到限制。

為了解決這個問題,resolve 現在被標記為非虛擬的,並且新增了兩個受保護的新方法:createStream()resolveStreamForKey()。這些方法允許子類別控制 resolve 的大部分行為,而無需複製所有錯誤處理工作。它還允許組成 ImageProvider 的子類別更確信到各個鏈式供應商只有一個公開的進入點。

遷移指南

#

ImageCache 變更

#

在遷移之前,程式碼不會覆寫 containsKey

遷移後的程式碼

dart
class MyImageCache implements ImageCache {
  @override
  bool containsKey(Object key) {
    // Check if your custom cache is tracking this key.
  }

  ...
}

ImageProvider 變更

#

遷移前的程式碼

dart
class MyImageProvider extends ImageProvider<Object> {
  @override
  ImageStream resolve(ImageConfiguration configuration) {
    // create stream
    // set up error handling
    // interact with ImageCache
    // call obtainKey/load, etc.
  }
  ...
}

遷移後的程式碼

dart
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