ImageCache 和 ImageProvider 的变更
概述
#ImageCache
现在有一个名为 containsKey
的方法。ImageProvider
子类不应覆写 resolve
方法,而应在 ImageProvider
上实现新方法。这些变更是作为单个提交提交到框架的。
变更说明
#以下部分描述了 containsKey
和 ImageProvider
的变更。
containsKey
变更
#ImageCache
的客户端(例如自定义 ImageProvider
)可能需要知道缓存是否已在跟踪某个图像。添加 containsKey
方法使调用者能够发现这一点,而无需调用诸如 putIfAbsent
之类的方法,这可能会触发对 ImageProvider.load
的不必要调用。
默认实现会检查待处理和已缓存的图像桶。
bool containsKey(Object key) {
return _pendingImages[key] != null || _cache[key] != null;
}
ImageProvider 变更
#ImageProvider.resolve
方法执行一些复杂的错误处理工作,通常不应被覆写。它以前还通过 ImageProvider.obtainKey
和 ImageProvider.load
将图像加载到图像缓存中。子类以前没有机会在不覆写 resolve
的情况下覆写此行为,并且如果多个 ImageProvider
都期望覆写 resolve
,则组合 ImageProvider
的能力会受到限制。
为解决此问题,resolve
现在被标记为非虚方法,并添加了两个新的保护方法:createStream()
和 resolveStreamForKey()
。这些方法允许子类控制 resolve
的大部分行为,而无需重复所有的错误处理工作。它还允许组合 ImageProvider
的子类更加确信,对各种链式提供程序只有一个公共入口点。
迁移指南
#ImageCache 变更
#迁移之前,代码不会覆写 containsKey
。
迁移后的代码
class MyImageCache implements ImageCache {
@override
bool containsKey(Object key) {
// Check if your custom cache is tracking this key.
}
...
}
ImageProvider 变更
#迁移前的代码
class MyImageProvider extends ImageProvider<Object> {
@override
ImageStream resolve(ImageConfiguration configuration) {
// create stream
// set up error handling
// interact with ImageCache
// call obtainKey/load, etc.
}
...
}
迁移后的代码
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