/// * 0 表示只执行一次
/// * -1 表示循环执行
int get repetitionCount native ‘Codec_repetitionCount’;
/// 获取下一个动画帧
Future getNextFrame() {
return _futurize(_getNextFrame);
}
String _getNextFrame(_Callback callback) native ‘Codec_getNextFrame’;
我们可以看到Codec
最终的结果是一个或多个(动图)帧,而这些帧最终会绘制到屏幕上。
MultiFrameImageStreamCompleter 的
codec
参数值为_loadAsync
方法的返回值,我们继续看_loadAsync
方法的实现:
Future<ui.Codec> _loadAsync(
NetworkImage key,
StreamController chunkEvents,
) async {
try {
//下载图片
final Uri resolved = Uri.base.resolve(key.url);
final HttpClientRequest request = await _httpClient.getUrl(resolved);
headers?.forEach((String name, String value) {
request.headers.add(name, value);
});
final HttpClientResponse response = await req 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 uest.close();
if (response.statusCode != HttpStatus.ok)
throw Exception(…);
// 接收图片数据
final Uint8List bytes = await consolidateHttpClientResponseBytes(
response,
onBytesReceived: (int cumulative, int total) {
chunkEvents.add(ImageChunkEvent(
cumulativeBytesLoaded: cumulative,
expectedTotalBytes: total,
));
},
);
if (bytes.lengthInBytes == 0)
throw Exception(‘NetworkImage is an empty file: $resolved’);
// 对图片数据进行解码
return PaintingBinding.instance.instantiateImageCodec(bytes);
} finally {<