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