跳至主要內容

ImageCache 大型圖片

摘要

#

ImageCachemaxByteSize 不再自動放大以容納大型圖片。

背景

#

先前,當將位元組大小大於 ImageCachemaxByteSize 的圖片載入 ImageCache 時,Flutter 會永久增加 maxByteSize 值以容納這些圖片。此邏輯有時會導致 maxByteSize 值膨脹,使得在記憶體受限的系統中工作更加困難。

變更說明

#

以下「之前」和「之後」的虛擬程式碼示範對 ImageCache 演算法所做的變更

dart
// Old logic pseudocode
void onLoadImage(Image image) {
  if (image.byteSize > _cache.maxByteSize) {
    _cache.maxByteSize = image.byteSize + 1000;
  }
  _cache.add(image);
  while (_cache.count > _cache.maxCount
      || _cache.byteSize > _cache.maxByteSize) {
    _cache.discardOldestImage();
  }
}
dart
// New logic pseudocode
void onLoadImage(Image image) {
  if (image.byteSize < _cache.maxByteSize) {
    _cache.add(image);
    while (_cache.count > _cache.maxCount
        || _cache.byteSize > cache.maxByteSize) {
      cache.discardOldestImage();
    }
  }
}

移轉指南

#

在某些情況下,新的邏輯可能會導致 ImageCache 頻繁地清除快取,而之前不會發生這種情況,特別是當您載入的圖片大於 cache.maxByteSize 值時。這可以透過以下其中一種方法來解決:

  1. 增加 ImageCache.maxByteSize 的值以容納更大的圖片。
  2. 調整您的圖片載入邏輯,以確保圖片能適當地放入您選擇的 ImageCache.maxByteSize 值中。
  3. 繼承 ImageCache,實作您想要的邏輯,並建立一個新的綁定,以提供您的 ImageCache 子類別(請參閱 image_cache.dart 原始碼)。

時間軸

#

舊的演算法不再支援。

已於版本中實作:1.16.3
在穩定版中:1.17

參考資料

#

API 文件

相關議題

相關 PR

其他