diff --git a/lib/core/image_cache.dart b/lib/core/image_cache.dart new file mode 100644 index 000000000..72190b35d --- /dev/null +++ b/lib/core/image_cache.dart @@ -0,0 +1,16 @@ +import 'dart:typed_data'; + +import 'package:myapp/core/lru_map.dart'; +import 'package:myapp/models/photo.dart'; + +class ImageLruCache { + static LRUMap _map = LRUMap(500); + + static Uint8List get(Photo photo) { + return _map.get(photo.generatedId); + } + + static void put(Photo photo, Uint8List imageData) { + _map.put(photo.generatedId, imageData); + } +} diff --git a/lib/ui/zoomable_image.dart b/lib/ui/zoomable_image.dart index 6572d22c3..575cd9861 100644 --- a/lib/ui/zoomable_image.dart +++ b/lib/ui/zoomable_image.dart @@ -1,5 +1,8 @@ +import 'dart:typed_data'; import 'package:flutter/widgets.dart'; import 'package:logger/logger.dart'; +import 'package:myapp/core/image_cache.dart'; +import 'package:myapp/core/image_cache.dart'; import 'package:myapp/core/lru_map.dart'; import 'package:myapp/core/thumbnail_cache.dart'; import 'package:myapp/models/photo.dart'; @@ -59,21 +62,19 @@ class _ZoomableImageState extends State { } if (!_loadedFinalImage) { - widget.photo.getBytes().then((bytes) { - if (mounted) { - setState(() { - final imageProvider = Image.memory(bytes).image; - precacheImage(imageProvider, context).then((value) { - if (mounted) { - setState(() { - _imageProvider = imageProvider; - _loadedFinalImage = true; - }); - } + if (ImageLruCache.get(widget.photo) != null) { + final bytes = ImageLruCache.get(widget.photo); + _onFinalImageLoaded(bytes, context); + } else { + widget.photo.getBytes().then((bytes) { + if (mounted) { + setState(() { + ImageLruCache.put(widget.photo, bytes); + _onFinalImageLoaded(bytes, context); }); - }); - } - }); + } + }); + } } if (_imageProvider != null) { @@ -88,4 +89,16 @@ class _ZoomableImageState extends State { return loadWidget; } } + + void _onFinalImageLoaded(Uint8List bytes, BuildContext context) { + final imageProvider = Image.memory(bytes).image; + precacheImage(imageProvider, context).then((value) { + if (mounted) { + setState(() { + _imageProvider = imageProvider; + _loadedFinalImage = true; + }); + } + }); + } }