ImageCache 大型图片
概述
#ImageCache
的 maxByteSize
不再会自动增大以适应大型图片。
背景
#以前,当将字节大小大于 ImageCache
的 maxByteSize
的图片加载到 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
值时。可以通过以下方法之一来解决此问题:
- 增加
ImageCache.maxByteSize
值以适应更大的图片。 - 调整您的图片加载逻辑,以确保图片能够很好地适应您选择的
ImageCache.maxByteSize
值。 - 子类化
ImageCache
,实现您想要的逻辑,并创建一个新的绑定来提供您的ImageCache
子类(请参阅image_cache.dart
源代码)。
时间线
#旧算法不再受支持。
发布版本: 1.16.3
稳定版本: 1.17
参考资料
#API 文档
相关议题
相关 PR
其他