import 'package:flutter/material.dart'; import 'parabolic_animation_widget.dart'; import 'popup_animation_widget.dart'; class AnimationPointManager { List list = []; static AnimationController? controller1; static AnimationController? controller2; Future addParabolicAniamtion({ required TickerProvider vsync, required GlobalKey stackKey, required GlobalKey startKey, required GlobalKey endKey, required Duration duration, required AnimationStatusListener statusListener, Color color = Colors.red, double size = 20, Offset startAdjustOffset = Offset.zero, Offset endAdjustOffset = Offset.zero, }) async { controller1 = createController(vsync, duration); Animation animation = createAnimation(controller1); AnimatedWidget animatedWidget = ParabolicAnimationWidget( animation: animation, stackKey: stackKey, startKey: startKey, endKey: endKey, size: size, color: color, startAdjustOffset: startAdjustOffset, endAdjustOffset: endAdjustOffset, ); list.add(animatedWidget); statusListener(AnimationStatus.dismissed); try { await controller1?.forward().orCancel; list.remove(animatedWidget); controller1?.dispose(); print('Controller1 disposed'); } on TickerCanceled { print("Ticker Canceled"); } catch (error) { print('Error: $error'); } statusListener(AnimationStatus.completed); } Future addPopupAniamtion({ required TickerProvider vsync, required GlobalKey stackKey, required GlobalKey startKey, required Widget child, required Duration duration, Offset popupOffset = Offset.zero, AnimationStatusListener? statusListener, }) async { controller2 = createController(vsync, duration); AnimatedWidget animatedWidget = PopupAnimationWidget( animation: controller2!.view, stackKey: stackKey, startKey: startKey, child: child, popupOffset: popupOffset, ); list.add(animatedWidget); if (statusListener != null) statusListener(AnimationStatus.dismissed); try { await controller2?.forward().orCancel; await controller2?.reverse().orCancel; list.remove(animatedWidget); controller2?.dispose(); print('Controller2 disposed'); } on TickerCanceled { print("Ticker Canceled"); } catch (error) { print('Error: $error'); } if (statusListener != null) statusListener(AnimationStatus.completed); } static AnimationController createController( TickerProvider vsync, Duration duration) { AnimationController ani = AnimationController( lowerBound: 0, upperBound: 1, duration: duration ?? Duration(milliseconds: 800), vsync: vsync); return ani; } static CurvedAnimation createAnimation(controller) { return CurvedAnimation(parent: controller, curve: Curves.linear); } void dispose() { try { controller1?.dispose(); controller2?.dispose(); } catch (error) { } } }