添加 ImageProvider.loadBuffer
摘要
#ImageProvider
现在有一个名为loadBuffer
的方法,其功能类似于load
,但它从ui.ImmutableBuffer
中解码。ui.ImmutableBuffer
现在可以从资产键直接创建。AssetBundle
类现在可以加载ui.ImmutableBuffer
。PaintingBinding
现在有一个名为instantiateImageCodecFromBuffer
的方法,其功能类似于instantiateImageCodec
。ImageProvider.load
现已弃用,将在未来版本中删除。PaintingBinding.instantiateImageCodec
现已弃用,将在未来版本中删除。
上下文
#ImageProvider.loadBuffer
是一种新方法,必须实现才能加载图像。此 API 允许以更快且对应用程序内存影响更小的方式执行基于资产的图像加载。
更改说明
#在加载资产图像时,以前图像提供程序 API 需要压缩数据的多个副本。首先,在打开资产时,数据被复制到外部堆并作为类型化数据数组公开给 Dart。然后,该类型化数据数组最终被转换为 ui.ImmutableBuffer
,后者在内部将数据复制到第二个结构以进行解码。
通过添加 ui.ImmutableBuffer.fromAsset
,可以将压缩的图像字节直接加载到用于解码的结构中。使用这种方法需要更改 ImageProvider
的字节加载管道。此过程也更快,因为它绕过了以前基于方法通道的加载程序的一些额外的调度开销。
ImageProvider.loadBuffer
否则与 ImageProvider.load
具有相同的约定,只是它提供了一个新的解码回调,该回调期望 ui.ImmutableBuffer
而不是 Uint8List
。对于从资产以外的其他位置获取字节的 ImageProvider
类,可以使用便捷方法 ui.ImmutableBuffer.fromUint8List
实现兼容性。
迁移指南
#子类化 ImageProvider
的类必须实现 loadBuffer
方法来加载资产。直接委托或调用 ImageProvider
方法的类必须使用 loadBuffer
而不是 load
。
迁移前代码
class MyImageProvider extends ImageProvider<MyImageProvider> {
@override
ImageStreamCompleter load(MyImageProvider key, DecoderCallback decode) {
return MultiFrameImageStreamCompleter(
codec: _loadData(key, decode),
);
}
Future<ui.Codec> _loadData(MyImageProvider key, DecoderCallback decode) async {
final Uint8List bytes = await bytesFromSomeApi();
return decode(bytes);
}
}
class MyDelegatingProvider extends ImageProvider<MyDelegatingProvider> {
MyDelegatingProvider(this.provider);
final ImageProvder provider;
@override
ImageStreamCompleter load(MyDelegatingProvider key, DecoderCallback decode) {
return provider.load(key, decode);
}
}
迁移后代码
class MyImageProvider extends ImageProvider<MyImageProvider> {
@override
ImageStreamCompleter loadBuffer(MyImageProvider key, DecoderBufferCallback decode) {
return MultiFrameImageStreamCompleter(
codec: _loadData(key, decode),
);
}
Future<ui.Codec> _loadData(MyImageProvider key, DecoderBufferCallback decode) async {
final Uint8List bytes = await bytesFromSomeApi();
final ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromUint8List(bytes);
return decode(buffer);
}
}
class MyDelegatingProvider extends ImageProvider<MyDelegatingProvider> {
MyDelegatingProvider(this.provider);
final ImageProvder provider;
@override
ImageStreamCompleter loadBuffer(MyDelegatingProvider key, DecoderCallback decode) {
return provider.loadBuffer(key, decode);
}
}
在这两种情况下,您可能都选择保留 ImageProvider.load
的先前实现,以便为代码的用户提供迁移时间。
时间线
#包含在版本中:3.1.0-0.0.pre.976
稳定版发布:3.3.0
参考资料
#API 文档
相关 PR
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-04-04。 查看源代码 或 报告问题.