decodeZip static method
Future<LottieComposition?>
decodeZip(
- List<
int> bytes, { - LottieImageProviderFactory? imageProviderFactory,
- ArchiveFile? filePicker(
- List<
ArchiveFile>
- List<
Implementation
static Future<LottieComposition?> decodeZip(
List<int> bytes, {
LottieImageProviderFactory? imageProviderFactory,
ArchiveFile? Function(List<ArchiveFile>)? filePicker,
}) async {
if (bytes[0] == 0x50 && bytes[1] == 0x4B) {
var archive = ZipDecoder().decodeBytes(bytes);
ArchiveFile? jsonFile;
if (filePicker != null) {
jsonFile = filePicker(archive.files);
}
jsonFile ??= archive.files.firstWhereOrNull(
(e) => e.name.startsWith('animations/') && e.name.endsWith('.json'),
);
jsonFile ??= archive.files.firstWhere(
(e) =>
e.name.endsWith('.json') && p.basename(e.name) != 'manifest.json',
);
var composition = parseJsonBytes(jsonFile.content);
await loadImages(composition.images.values, (image) async {
var imagePath = p.posix.join(image.dirName, image.fileName);
var found = archive.files.firstWhereOrNull(
(f) =>
_normalizeArchivePath(f.name) == _normalizeArchivePath(imagePath),
);
ImageProvider? provider;
if (imageProviderFactory != null) {
provider = imageProviderFactory(image);
}
if (provider != null) {
image.loadedImage = await loadImage(composition, image, provider);
}
if (found != null) {
image.loadedImage ??= await loadImage(
composition,
image,
MemoryImage(found.content),
);
}
});
var fontFiles = {
for (var file in archive.files)
if (_fontExtensions.contains(p.extension(file.name).toLowerCase()))
p.basenameWithoutExtension(file.name).toLowerCase(): file,
};
for (var font in composition.fonts.values) {
var file =
fontFiles[font.name.toLowerCase()] ??
fontFiles[font.family.toLowerCase()];
if (file != null) {
composition._fontsToLoad.add(FontToLoad(file.content, font));
}
}
return composition;
}
return null;
}