pictureFor method

Picture pictureFor({
  1. required Object slot,
  2. required Object revision,
  3. required void paint(
    1. Canvas canvas
    ),
})

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;
}