showOverlay static method

void showOverlay({
  1. required Widget child,
  2. Duration duration = const Duration(seconds: 3),
  3. Duration animationDuration = const Duration(milliseconds: 250),
  4. Alignment alignment = Alignment.topCenter,
  5. EdgeInsets padding = const EdgeInsets.all(20),
  6. bool dismissOnTap = false,
  7. VoidCallback? onDismiss,
})

Implementation

static void showOverlay({
  required Widget child,
  Duration duration = const Duration(seconds: 3),
  Duration animationDuration = const Duration(milliseconds: 250),
  Alignment alignment = Alignment.topCenter,
  EdgeInsets padding = const EdgeInsets.all(20),
  bool dismissOnTap = false,
  VoidCallback? onDismiss,
}) {
  dismissOverlay();

  final OverlayEntry overlay = OverlayEntry(
    builder: (BuildContext context) => SafeArea(
      child: Padding(
        padding: padding,
        child: Align(
          alignment: alignment,
          // Fade the overlay in for a smoother appearance
          child: TweenAnimationBuilder<double>(
            tween: Tween<double>(begin: 0, end: 1),
            duration: animationDuration,
            builder: (BuildContext context, double opacity, Widget? animatedChild) => Opacity(opacity: opacity, child: animatedChild),
            child: Material(
              color: Colors.transparent,
              child: dismissOnTap
                  ? GestureDetector(
                      onTap: () {
                        dismissOverlay();
                        onDismiss?.call();
                      },
                      child: child,
                    )
                  : child,
            ),
          ),
        ),
      ),
    ),
  );

  _currentOverlay = overlay;
  Overlay.of(navigatorKey.currentContext!).insert(overlay);

  if (duration != Duration.zero) {
    Future<void>.delayed(duration, () {
      dismissOverlay();
      onDismiss?.call();
    });
  }
}