概述

#

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

其他