@@ -397,16 +397,16 @@ class ImageCache {
397
397
if (! kReleaseMode) {
398
398
listenerTask = TimelineTask (parent: timelineTask)..start ('listener' );
399
399
}
400
- // If we're doing tracing, we need to make sure that we don't try to finish
401
- // the trace entry multiple times if we get re-entrant calls from a multi-
402
- // frame provider here.
400
+ // A multi-frame provider may call the listener more than once. We need do make
401
+ // sure that some cleanup works won't run multiple times, such as finishing the
402
+ // tracing task or removing the listeners
403
403
bool listenedOnce = false ;
404
404
405
405
// We shouldn't use the _pendingImages map if the cache is disabled, but we
406
406
// will have to listen to the image at least once so we don't leak it in
407
407
// the live image tracking.
408
- // If the cache is disabled, this variable will be set.
409
- _PendingImage ? untrackedPendingImage ;
408
+ final bool trackPendingImage = maximumSize > 0 && maximumSizeBytes > 0 ;
409
+ late _PendingImage pendingImage ;
410
410
void listener (ImageInfo ? info, bool syncCall) {
411
411
int ? sizeBytes;
412
412
if (info != null ) {
@@ -421,14 +421,14 @@ class ImageCache {
421
421
_trackLiveImage (key, result, sizeBytes);
422
422
423
423
// Only touch if the cache was enabled when resolve was initially called.
424
- if (untrackedPendingImage == null ) {
424
+ if (trackPendingImage ) {
425
425
_touch (key, image, listenerTask);
426
426
} else {
427
427
image.dispose ();
428
428
}
429
429
430
- final _PendingImage ? pendingImage = untrackedPendingImage ?? _pendingImages.remove (key);
431
- if (pendingImage != null ) {
430
+ _pendingImages.remove (key);
431
+ if (! listenedOnce ) {
432
432
pendingImage.removeListener ();
433
433
}
434
434
if (! kReleaseMode && ! listenedOnce) {
@@ -445,10 +445,9 @@ class ImageCache {
445
445
}
446
446
447
447
final ImageStreamListener streamListener = ImageStreamListener (listener);
448
- if (maximumSize > 0 && maximumSizeBytes > 0 ) {
449
- _pendingImages[key] = _PendingImage (result, streamListener);
450
- } else {
451
- untrackedPendingImage = _PendingImage (result, streamListener);
448
+ pendingImage = _PendingImage (result, streamListener);
449
+ if (trackPendingImage) {
450
+ _pendingImages[key] = pendingImage;
452
451
}
453
452
// Listener is removed in [_PendingImage.removeListener].
454
453
result.addListener (streamListener);
0 commit comments