show static method

Future<String?> show(
  1. BuildContext context, {
  2. required String title,
  3. required String labelText,
  4. String? hintText,
  5. required String cancelText,
  6. required String confirmText,
  7. String initialValue = '',
  8. String barrierLabel = 'Dismiss',
})

Implementation

static Future<String?> show(
  BuildContext context, {
  required String title,
  required String labelText,
  String? hintText,
  required String cancelText,
  required String confirmText,
  String initialValue = '',
  String barrierLabel = 'Dismiss',
}) async {
  final TextEditingController controller = TextEditingController(
    text: initialValue,
  );
  final fluffyTheme = context.fluffyTheme;

  try {
    final result = await showGeneralDialog(
      context: context,
      barrierDismissible: false,
      barrierLabel: barrierLabel,
      barrierColor: FluffyColors.barrier,
      transitionDuration: FluffyDurations.dialogTransition,
      transitionBuilder: (context, anim1, anim2, child) {
        return FadeTransition(
          opacity: anim1,
          child: ScaleTransition(
            scale: Tween<double>(begin: 0.95, end: 1.0).animate(
              CurvedAnimation(parent: anim1, curve: Curves.easeOutCubic),
            ),
            child: child,
          ),
        );
      },
      pageBuilder: (BuildContext context, anim1, anim2) {
        void confirm() {
          context.navigator.pop(controller.text);
        }

        final targetPlatform = fluffyTheme.platform ?? defaultTargetPlatform;
        final isDesktop = switch (targetPlatform) {
          TargetPlatform.macOS ||
          TargetPlatform.windows ||
          TargetPlatform.linux => true,
          _ => false,
        };

        final dialog = DialogCard(
          title: Text(title),
          content: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              InputText(
                controller: controller,
                label: labelText,
                hintText: hintText,
                onSubmitted: (_) => confirm(),
              ),
            ],
          ),
          actions: [
            Row(
              mainAxisAlignment: switch (isDesktop) {
                true => MainAxisAlignment.end,
                false => MainAxisAlignment.center,
              },
              children: switch (isDesktop) {
                true => [
                  Button(
                    variant: ButtonVariant.ghost,
                    tooltip: cancelText,
                    label: cancelText,
                    mainAxisSize: MainAxisSize.min,
                    padding: EdgeInsets.symmetric(
                      horizontal: Spacing.d16,
                      vertical: Spacing.d8,
                    ),
                    onPressed: () {
                      context.navigator.pop();
                    },
                  ),
                  Spacing.h8,
                  Button(
                    variant: ButtonVariant.primary,
                    tooltip: confirmText,
                    label: confirmText,
                    mainAxisSize: MainAxisSize.min,
                    padding: EdgeInsets.symmetric(
                      horizontal: Spacing.d16,
                      vertical: Spacing.d8,
                    ),
                    onPressed: confirm,
                  ),
                ],
                false => [
                  Expanded(
                    child: Button(
                      variant: ButtonVariant.ghost,
                      tooltip: cancelText,
                      label: cancelText,
                      titleExpand: ButtonTitleExpand.shrink,
                      onPressed: () {
                        context.navigator.pop();
                      },
                    ),
                  ),
                  Spacing.h8,
                  Expanded(
                    child: Button(
                      variant: ButtonVariant.primary,
                      tooltip: confirmText,
                      label: confirmText,
                      titleExpand: ButtonTitleExpand.shrink,
                      onPressed: confirm,
                    ),
                  ),
                ],
              },
            ),
          ],
        );

        return FluffyTheme(
          data: fluffyTheme,
          child: CallbackShortcuts(
            bindings: {
              const SingleActivator(LogicalKeyboardKey.enter): confirm,
              const SingleActivator(LogicalKeyboardKey.numpadEnter): confirm,
            },
            child: Focus(
              autofocus: true,
              child: dialog,
            ),
          ),
        );
      },
    );

    if (result is! String) {
      return null;
    }

    return result;
  } finally {
    controller.dispose();
  }
}