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
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-04-04。 查看源代码 或 报告问题.