From c651ee8c323e279cfe0329db6abab6b43453cede Mon Sep 17 00:00:00 2001 From: otsmr Date: Mon, 20 Jul 2026 19:34:57 +0200 Subject: [PATCH] precache images in the memories viewer --- .../memories/synchronized_viewer.view.dart | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/src/visual/views/memories/synchronized_viewer.view.dart b/lib/src/visual/views/memories/synchronized_viewer.view.dart index c5ecbdbe..45e3897e 100644 --- a/lib/src/visual/views/memories/synchronized_viewer.view.dart +++ b/lib/src/visual/views/memories/synchronized_viewer.view.dart @@ -42,6 +42,7 @@ class _SynchronizedImageViewerScreenState final Set _favoritedMediaIds = {}; bool _isSaving = false; final Set _storedMediaIds = {}; + final Set _precachedMediaIds = {}; late int _currentIndex; bool _isZoomed = false; @@ -55,11 +56,15 @@ class _SynchronizedImageViewerScreenState final initialId = widget.galleryItems[widget.initialIndex].mediaService.mediaFile.mediaId; _currentlyViewedMediaIdNotifier = ValueNotifier(initialId); + _precachedMediaIds.add(initialId); _horizontalPager = PageController(initialPage: widget.initialIndex); _verticalPager = PageController(initialPage: 1); WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) _verticalPager.addListener(_onVerticalScrollUpdated); + if (mounted) { + _verticalPager.addListener(_onVerticalScrollUpdated); + _precacheNeighbours(_currentIndex); + } }); for (final item in widget.galleryItems) { @@ -314,6 +319,8 @@ class _SynchronizedImageViewerScreenState .mediaId; _currentlyViewedMediaIdNotifier.value = newMediaId; widget.activeMediaIdNotifier.value = newMediaId; + _precachedMediaIds.add(newMediaId); + _precacheNeighbours(idx); }, itemBuilder: (context, index) { return SynchronizedViewerItemComp( @@ -369,4 +376,40 @@ class _SynchronizedImageViewerScreenState ), ); } + + void _precacheNeighbours(int index) { + if (!mounted) return; + + final indicesToPrecache = [index - 5, index + 5]; + + for (final idx in indicesToPrecache) { + if (idx >= 0 && idx < widget.galleryItems.length) { + final item = widget.galleryItems[idx]; + if (item.mediaService.mediaFile.type == MediaType.video) { + continue; + } + + final mediaId = item.mediaService.mediaFile.mediaId; + if (_precachedMediaIds.contains(mediaId)) { + continue; + } + + final filePath = + item.mediaService.storedPath.existsSync() && + item.mediaService.storedPath.lengthSync() > 0 + ? item.mediaService.storedPath + : item.mediaService.tempPath.existsSync() && + item.mediaService.tempPath.lengthSync() > 0 + ? item.mediaService.tempPath + : item.mediaService.thumbnailPath; + + if (filePath.existsSync() && filePath.lengthSync() > 0) { + _precachedMediaIds.add(mediaId); + precacheImage(FileImage(filePath), context).onError((e, s) { + _precachedMediaIds.remove(mediaId); + }); + } + } + } + } }