pictureFor method
Implementation
Picture pictureFor({
required Object slot,
required Object revision,
required void Function(Canvas canvas) paint,
}) {
final cached = _pictures.remove(slot);
if (cached != null &&
(identical(cached.revision, revision) || cached.revision == revision)) {
_pictures[slot] = cached;
return cached.picture;
}
final recorder = PictureRecorder();
late final Picture picture;
try {
paint(Canvas(recorder));
picture = recorder.endRecording();
} catch (_) {
// A failed replacement must neither leak its recorder nor invalidate
// the previously published picture for this slot.
if (recorder.isRecording) recorder.endRecording().dispose();
if (cached != null) _pictures[slot] = cached;
rethrow;
}
if (_pictures.length >= _maximumPictures) {
_pictures.remove(_pictures.keys.first)?.picture.dispose();
}
_recordingCount++;
_pictures[slot] = _CachedPicture(revision, picture);
cached?.picture.dispose();
return picture;
}