From fbdec00a620d1eed150a7bc66e89c4a061687e3b Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 25 Aug 2025 09:16:59 +0530 Subject: [PATCH 1/4] Improve lru cache thumbnail rendering speed when scrolling gallery by precaching it it flutter's image cache --- .../apps/photos/lib/ui/viewer/file/thumbnail_widget.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart index a8ebac8086..3cd3488a85 100644 --- a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart +++ b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart @@ -245,12 +245,12 @@ class _ThumbnailWidgetState extends State { final cachedSmallThumbnail = ThumbnailInMemoryLruCache.get(widget.file, thumbnailSmallSize); if (cachedSmallThumbnail != null) { - _imageProvider = Image.memory( + final imageProvider = Image.memory( cachedSmallThumbnail, cacheHeight: optimizedImageHeight, cacheWidth: optimizedImageWidth, ).image; - _hasLoadedThumbnail = true; + _cacheAndRender(imageProvider); } else { if (widget.diskLoadDeferDuration != null) { Future.delayed(widget.diskLoadDeferDuration!, () { @@ -383,12 +383,12 @@ class _ThumbnailWidgetState extends State { _isLoadingRemoteThumbnail = true; final cachedThumbnail = ThumbnailInMemoryLruCache.get(widget.file); if (cachedThumbnail != null) { - _imageProvider = Image.memory( + final imageProvider = Image.memory( cachedThumbnail, cacheHeight: optimizedImageHeight, cacheWidth: optimizedImageWidth, ).image; - _hasLoadedThumbnail = true; + _cacheAndRender(imageProvider); return; } From a856a822492d1986ea24af2409b527b0cefc752f Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 25 Aug 2025 09:18:29 +0530 Subject: [PATCH 2/4] Refactor --- .../lib/ui/viewer/file/thumbnail_widget.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart index 3cd3488a85..75eaf6fe5d 100644 --- a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart +++ b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart @@ -251,16 +251,16 @@ class _ThumbnailWidgetState extends State { cacheWidth: optimizedImageWidth, ).image; _cacheAndRender(imageProvider); + return; + } + if (widget.diskLoadDeferDuration != null) { + Future.delayed(widget.diskLoadDeferDuration!, () { + if (mounted) { + _getThumbnailFromDisk(); + } + }); } else { - if (widget.diskLoadDeferDuration != null) { - Future.delayed(widget.diskLoadDeferDuration!, () { - if (mounted) { - _getThumbnailFromDisk(); - } - }); - } else { - _getThumbnailFromDisk(); - } + _getThumbnailFromDisk(); } } } From 0da3dc5084a542acdaa793b2cd980a2977439526 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 25 Aug 2025 09:20:08 +0530 Subject: [PATCH 3/4] Skip clearing flutter image cache since default (current) limit is 100MB and the threshold to clear is 250MB --- mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart index 75eaf6fe5d..6ab50e3019 100644 --- a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart +++ b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart @@ -432,11 +432,6 @@ class _ThumbnailWidgetState extends State { } void _cacheAndRender(ImageProvider imageProvider) { - if (imageCache.currentSizeBytes > 256 * 1024 * 1024) { - _logger.info("Clearing image cache"); - imageCache.clear(); - imageCache.clearLiveImages(); - } precacheImage(imageProvider, context).then((value) { if (mounted) { setState(() { From f139e0a0982520e778f3cc4f9d252133d3fafa80 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 25 Aug 2025 09:21:57 +0530 Subject: [PATCH 4/4] Fix flickering of GalleryFileWidget on hero animation after closing it's open full view --- .../lib/ui/viewer/file/thumbnail_widget.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart index 6ab50e3019..cbc707d6d4 100644 --- a/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart +++ b/mobile/apps/photos/lib/ui/viewer/file/thumbnail_widget.dart @@ -432,14 +432,14 @@ class _ThumbnailWidgetState extends State { } void _cacheAndRender(ImageProvider imageProvider) { - precacheImage(imageProvider, context).then((value) { - if (mounted) { - setState(() { - _imageProvider = imageProvider; - _hasLoadedThumbnail = true; - }); - } - }); + if (mounted) { + setState(() { + _imageProvider = imageProvider; + _hasLoadedThumbnail = true; + }); + } + + precacheImage(imageProvider, context); } void _reset() {