浏览代码

Perf: Avoid redundant computation of imageInfo

Neeraj Gupta 1 年之前
父节点
当前提交
6ee182ecec
共有 1 个文件被更改,包括 13 次插入13 次删除
  1. 13 13
      lib/ui/viewer/file/zoomable_image.dart

+ 13 - 13
lib/ui/viewer/file/zoomable_image.dart

@@ -127,7 +127,6 @@ class _ZoomableImageState extends State<ZoomableImage>
       if (cachedThumbnail != null) {
         _imageProvider = Image.memory(cachedThumbnail).image;
         _loadedSmallThumbnail = true;
-        _captureThumbnailDimensions(_imageProvider!);
       } else {
         getThumbnailFromServer(_photo).then((file) {
           final imageProvider = Image.memory(file).image;
@@ -137,7 +136,6 @@ class _ZoomableImageState extends State<ZoomableImage>
                 setState(() {
                   _imageProvider = imageProvider;
                   _loadedSmallThumbnail = true;
-                  _captureThumbnailDimensions(_imageProvider!);
                 });
               }
             }).catchError((e) {
@@ -235,7 +233,10 @@ class _ZoomableImageState extends State<ZoomableImage>
     if (mounted) {
       precacheImage(imageProvider, context).then((value) async {
         if (mounted) {
-          await _updatePhotoViewController(imageProvider);
+          await _updatePhotoViewController(
+            previewImageProvider: _imageProvider,
+            finalImageProvider: imageProvider,
+          );
           setState(() {
             _imageProvider = imageProvider;
             _loadedFinalImage = true;
@@ -246,18 +247,17 @@ class _ZoomableImageState extends State<ZoomableImage>
     }
   }
 
-  Future<void> _captureThumbnailDimensions(ImageProvider imageProvider) async {
-    final imageInfo = await getImageInfo(imageProvider);
-    _thumbnailWidth = imageInfo.image.width;
-  }
-
-  Future<void> _updatePhotoViewController(ImageProvider imageProvider) async {
-    if (_thumbnailWidth == null || _photoViewController.scale == null) {
+  Future<void> _updatePhotoViewController({
+    required ImageProvider? previewImageProvider,
+    required ImageProvider finalImageProvider,
+  }) async {
+    if (_photoViewController.scale == null || previewImageProvider == null) {
       return;
     }
-    final imageInfo = await getImageInfo(imageProvider);
+    final prevImageInfo = await getImageInfo(previewImageProvider);
+    final finalImageInfo = await getImageInfo(finalImageProvider);
     final scale = _photoViewController.scale! /
-        (imageInfo.image.width / _thumbnailWidth!);
+        (finalImageInfo.image.width / prevImageInfo.image.width);
     final currentPosition = _photoViewController.value.position;
     final positionScaleFactor = 1 / scale;
     final newPosition = currentPosition.scale(
@@ -268,7 +268,7 @@ class _ZoomableImageState extends State<ZoomableImage>
       initialPosition: newPosition,
       initialScale: scale,
     );
-    _updateAspectRatioIfNeeded(imageInfo).ignore();
+    _updateAspectRatioIfNeeded(finalImageInfo).ignore();
   }
 
   // Fallback logic to finish back fill and update aspect