showWithAnimation static method

OverlayShower showWithAnimation({
  1. required Widget child,
  2. String? key,
  3. Duration? appearDuration,
  4. Duration? dismissDuration,
  5. Duration? onScreenDuration,
  6. Widget appearAnimatedBuilder(
    1. OverlayShower shower,
    2. AnimationController controller,
    3. Widget widget
    )?,
  7. Widget dismissAnimatedBuilder(
    1. OverlayShower shower,
    2. AnimationController controller,
    3. Widget widget
    )?,
})

Implementation

static OverlayShower showWithAnimation({
  required Widget child,
  String? key,
  Duration? appearDuration,
  Duration? dismissDuration,
  Duration? onScreenDuration,
  Widget Function(OverlayShower shower, AnimationController controller, Widget widget)? appearAnimatedBuilder,
  Widget Function(OverlayShower shower, AnimationController controller, Widget widget)? dismissAnimatedBuilder,
}) {
  const Duration defaultDuration = Duration(milliseconds: 500);
  return showWithTickerVsyncBuilder(
      key: key,
      tickerBuilder: (shower, vsync) {
        AnimationController appearController = AnimationController(
          vsync: vsync,
          duration: appearDuration ?? defaultDuration,
          reverseDuration: dismissDuration ?? defaultDuration,
        );

        void dismiss() {
          if (dismissAnimatedBuilder != null) {
            AnimationController dismissController = AnimationController(vsync: vsync, duration: dismissDuration ?? defaultDuration);
            shower.setNewChild(dismissAnimatedBuilder(shower, dismissController, child));
            dismissController.forward().then((value) {
              shower.dismiss();
            });
          } else {
            if (shower.isShowing) {
              appearController.reverse().then((value) {
                shower.dismiss();
              });
            }
          }
        }

        if (onScreenDuration == Duration.zero) {
          // put the controller to caller, if onScreenDuration == Duration.zero
          shower.obj = [appearController, dismiss];
        } else {
          // default dismiss in 3 seconds
          Duration duration = onScreenDuration ?? const Duration(milliseconds: 3000);
          Timer dismissTimer = Timer(duration, () {
            dismiss();
          });
          // put the timer to caller, if onScreenDuration != Duration.zero
          shower.obj = [dismissTimer, dismiss];
        }
        shower.addDismissCallBack((shower) {
          appearController.dispose();
        });

        if (appearAnimatedBuilder == null) {
          // 1. Using Opacity & Shower's builder default
          appearController.addListener(() {
            shower.setState(() {});
          });
          Animation<double> opacity = Tween(begin: 0.0, end: 1.0).animate(appearController);
          shower.builder = (shower) {
            return Opacity(opacity: opacity.value, child: child);
          };
        } else {
          // 2. Using animation widget
          shower.setNewChild(appearAnimatedBuilder(shower, appearController, child));
        }

        // start the show animation
        appearController.forward();
      });
}