概述

#

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 發生頻繁的快取失效(thrashing)的情況,而以前沒有,特別是當您載入的圖片大於您的 cache.maxByteSize 值時。可以透過以下方法之一來解決此問題:

  1. 增加 ImageCache.maxByteSize 值以適應更大的圖片。
  2. 調整您的圖片載入邏輯,以確保圖片能夠很好地適應您選擇的 ImageCache.maxByteSize 值。
  3. 子類化 ImageCache,實現您想要的邏輯,並建立一個新的繫結來提供您的 ImageCache 子類(請參閱 image_cache.dart 原始碼)。

時間線

#

舊演算法不再受支援。

釋出版本: 1.16.3
穩定版本: 1.17

參考資料

#

API 文件

相關議題

相關 PR

其他