actionSheet<T> static method

Future<T?> actionSheet<T>({
  1. required List<UNavAction<T>> actions,
  2. String? title,
  3. String? message,
  4. bool showCancel = true,
  5. String? cancelText,
  6. bool barrierDismissible = true,
})

Implementation

static Future<T?> actionSheet<T>({
  required List<UNavAction<T>> actions,
  String? title,
  String? message,
  bool showCancel = true,
  String? cancelText,
  bool barrierDismissible = true,
}) {
  final BuildContext ctx = navigatorKey.currentContext!;
  if (UApp.isIos) {
    return showCupertinoModalPopup<T>(
      context: ctx,
      barrierDismissible: barrierDismissible,
      builder: (BuildContext context) => CupertinoActionSheet(
        title: title != null ? Text(title) : null,
        message: message != null ? Text(message) : null,
        actions: actions
            .map(
              (UNavAction<T> action) => CupertinoActionSheetAction(
                isDestructiveAction: action.isDestructive,
                onPressed: action.enabled ? () => back<T>(action.value) : () {},
                child: Text(action.label),
              ),
            )
            .toList(),
        cancelButton: showCancel
            ? CupertinoActionSheetAction(
                onPressed: back,
                child: Text(cancelText ?? U.s.cancel),
              )
            : null,
      ),
    );
  }
  return showModalBottomSheet<T>(
    context: ctx,
    isDismissible: barrierDismissible,
    showDragHandle: true,
    builder: (BuildContext context) => SafeArea(
      child: UColumn(
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          if (title != null) UTextTitleMedium(title, textAlign: TextAlign.center).pOnly(bottom: 4),
          if (message != null) UTextBodySmall(message, textAlign: TextAlign.center).pOnly(bottom: 8),
          ...actions.map(
            (UNavAction<T> action) => ListTile(
              enabled: action.enabled,
              leading: action.icon != null ? Icon(action.icon, color: action.isDestructive ? Theme.of(context).colorScheme.error : null) : null,
              title: UTextBodyLarge(
                action.label,
                color: action.isDestructive ? Theme.of(context).colorScheme.error : null,
              ),
              onTap: () => back<T>(action.value),
            ),
          ),
          if (showCancel)
            ListTile(
              title: UTextBodyLarge(cancelText ?? U.s.cancel, textAlign: TextAlign.center),
              onTap: back,
            ),
        ],
      ),
    ),
  );
}