fetchGif static method

Future<List<ImageInfo>> fetchGif(
  1. ImageProvider<Object> provider,
  2. GifCache cache
)

Implementation

static Future<List<ImageInfo>> fetchGif(
    ImageProvider provider, GifCache cache) async {
  List<ImageInfo> infos = [];
  late Uint8List data;
  String key = provider is NetworkImage
      ? provider.url
      : provider is AssetImage
          ? provider.assetName
          : provider is MemoryImage
              ? provider.bytes.toString()
              : "";
  if (cache.caches.containsKey(key)) {
    infos = cache.caches[key]!;
    return infos;
  }
  if (provider is NetworkImage) {
    final Uri resolved = Uri.base.resolve(provider.url);
    final HttpClientRequest request = await _httpClient.getUrl(resolved);
    provider.headers?.forEach((String name, String value) {
      request.headers.add(name, value);
    });
    final HttpClientResponse response = await request.close();
    data = await consolidateHttpClientResponseBytes(response);
  } else if (provider is AssetImage) {
    AssetBundleImageKey key =
        await provider.obtainKey(const ImageConfiguration());
    data = (await key.bundle.load(key.name)).buffer.asUint8List();
  } else if (provider is FileImage) {
    data = await provider.file.readAsBytes();
  } else if (provider is MemoryImage) {
    data = provider.bytes;
  }

  var immutableBuffer = await ImmutableBuffer.fromUint8List(data);
  var codec = await PaintingBinding.instance
      .instantiateImageCodecFromBuffer(immutableBuffer);
  infos = [];
  for (int i = 0; i < codec.frameCount; i++) {
    FrameInfo frameInfo = await codec.getNextFrame();
    //scale ??
    infos.add(ImageInfo(image: frameInfo.image));
  }
  cache.caches.putIfAbsent(key, () => infos);
  return infos;
}