概述

#

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

變更說明

#

下面的各部分描述了對 containsKeyImageProvider 的更改。

containsKey 更改

#

ImageCache 的客戶端,例如自定義 ImageProvider,可能想知道快取是否已在跟蹤某個影像。新增 containsKey 方法允許呼叫者在呼叫 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