概述

#

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