跳至主要内容

ImageCache 和 ImageProvider 更改

摘要

#

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