Add image decode listeners

This commit is contained in:
Umberto Sonnino
2022-05-16 15:26:22 +01:00
parent cfc5a5d10e
commit d6af3e1598
2 changed files with 19 additions and 2 deletions

View File

@ -12,6 +12,10 @@ class ImageAsset extends ImageAssetBase {
ui.Image? _image;
ui.Image? get image => _image;
/// A list of Images that need to know when the underlying bytes have been
/// successfully decoded.
List<Image>? _decodeListeners;
ImageAsset();
@visibleForTesting
@ -22,12 +26,22 @@ class ImageAsset extends ImageAssetBase {
_image = image;
}
/// Registers [asset] to know when these image bytes have been decoded.
void addDecodeListener(Image asset) {
(_decodeListeners ??= []).add(asset);
}
@override
Future<void> decode(Uint8List bytes) {
final completer = Completer<void>();
ui.decodeImageFromList(bytes, (value) {
_image = value;
completer.complete();
// Tell listeners that the image is ready to be drawn: mark them dirty.
_decodeListeners
?..forEach((e) => e.context.markNeedsAdvance())
..clear();
});
return completer.future;
}

View File

@ -37,8 +37,9 @@ class Image extends ImageBase
@override
void draw(ui.Canvas canvas) {
var uiImage = asset?.image;
final uiImage = asset?.image;
if (uiImage == null) {
print('No image yet?! ${asset?.name} $uiImage');
return;
}
bool clipped = clip(canvas);
@ -84,7 +85,6 @@ class Image extends ImageBase
}
}
@override
int get assetIdPropertyKey => ImageBase.assetIdPropertyKey;
@ -100,6 +100,9 @@ class Image extends ImageBase
void copy(covariant Image source) {
super.copy(source);
asset = source.asset;
if (asset?.image == null) {
asset?.addDecodeListener(this);
}
}
@override