Browse Source

fix(mobile): Fixed hero animation re-enabling on immich asset grid (#2169)

* fixed hero animation re-enabling on immich asset grid

* comments
martyfuhry 2 years ago
parent
commit
ad680b6a35
1 changed files with 20 additions and 12 deletions
  1. 20 12
      mobile/lib/modules/home/ui/asset_grid/immich_asset_grid.dart

+ 20 - 12
mobile/lib/modules/home/ui/asset_grid/immich_asset_grid.dart

@@ -38,19 +38,27 @@ class ImmichAssetGrid extends HookConsumerWidget {
 
 
     // Needs to suppress hero animations when navigating to this widget
     // Needs to suppress hero animations when navigating to this widget
     final enableHeroAnimations = useState(false);
     final enableHeroAnimations = useState(false);
+    final transitionDuration = ModalRoute.of(context)?.transitionDuration;
 
 
-    // Wait for transition to complete, then re-enable
-    ModalRoute.of(context)?.animation?.addListener(() {
-      // If we've already enabled, we are done
-      if (enableHeroAnimations.value) {
-        return;
-      }
-      final animation = ModalRoute.of(context)?.animation;
-      if (animation != null) {
-        // When the animation is complete, re-enable hero animations
-        enableHeroAnimations.value = animation.isCompleted;
-      }
-    });
+    useEffect(
+      () {
+        // Wait for transition to complete, then re-enable
+        if (transitionDuration == null) {
+          // No route transition found, maybe we opened this up first
+          enableHeroAnimations.value = true;
+        } else {
+          // Unfortunately, using the transition animation itself didn't
+          // seem to work reliably. So instead, wait until the duration of the
+          // animation has elapsed to re-enable the hero animations
+          Future.delayed(transitionDuration)
+              .then((_) {
+                enableHeroAnimations.value = true;
+              });
+        }
+        return null;
+      },
+      [],
+    );
 
 
     Future<bool> onWillPop() async {
     Future<bool> onWillPop() async {
       enableHeroAnimations.value = false;
       enableHeroAnimations.value = false;