概述

#

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