celebrateInDialog static method

Future<void> celebrateInDialog(
  1. BuildContext context, {
  2. Preset preset = Preset.nova,
  3. CelebrationScene? scene,
  4. ConfettiShowcase? showcase,
  5. bool enableHaptics = true,
  6. bool enableSound = false,
  7. String? soundAssetPath,
  8. CelebrationFeedback? feedback,
  9. List<String>? emojiPool,
  10. ConfettiCustomization? customization,
  11. CelebrationMessageOptions? overlayMessage,
  12. VoidCallback? onComplete,
  13. bool barrierDismissible = false,
  14. Color? barrierColor,
  15. bool useSafeArea = true,
})

Celebrates inside a transparent, edge-to-edge Dialog (modal full-screen celebration overlay).

Returns a Future that completes when the dialog route is popped: either after particles finish, when CelebrationMessageOptions.durationInSeconds elapses, or when the user dismisses the barrier (if barrierDismissible is true). onComplete runs immediately before the route is popped from a successful finish (particles or timer), not when the barrier dismisses the dialog.

Does nothing when Navigator.maybeOf is null.

Implementation

static Future<void> celebrateInDialog(
  BuildContext context, {
  Preset preset = Preset.nova,
  CelebrationScene? scene,
  ConfettiShowcase? showcase,
  bool enableHaptics = true,
  bool enableSound = false,
  String? soundAssetPath,
  CelebrationFeedback? feedback,
  List<String>? emojiPool,
  ConfettiCustomization? customization,
  CelebrationMessageOptions? overlayMessage,
  VoidCallback? onComplete,
  bool barrierDismissible = false,
  Color? barrierColor,
  bool useSafeArea = true,
}) async {
  final navigator = Navigator.maybeOf(context);
  if (navigator == null) return;

  final effectivePreset = scene?.preset ?? preset;
  final effectiveCustomization =
      ConfettiCustomization.merge(scene?.customization, customization);

  final msg = overlayMessage;
  final messageOptions = msg ?? const CelebrationMessageOptions(message: '');
  final showBanner = msg != null && msg.shouldPaintText;

  return showDialog<void>(
    context: context,
    barrierDismissible: barrierDismissible,
    barrierColor: barrierColor ?? const Color(0x80000000),
    useSafeArea: useSafeArea,
    builder: (dialogContext) {
      return _CelebrationDialogHost(
        preset: effectivePreset,
        showcase: showcase,
        customization: effectiveCustomization,
        feedback: feedback,
        enableHaptics: enableHaptics,
        enableSound: enableSound,
        soundAssetPath: soundAssetPath,
        emojiPool: emojiPool,
        messageOptions: messageOptions,
        showMessageLayer: showBanner,
        onFinished: () {
          onComplete?.call();
          if (dialogContext.mounted) {
            Navigator.of(dialogContext).pop();
          }
        },
      );
    },
  );
}