2025-02-27 10:46:52 +08:00

194 lines
5.6 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'style.dart';
class HDialog {
static Future<T?> show<T>(
{required BuildContext context,
String title = '温馨提示',
String? content,
bool barrierDismissible = true,
Color? barrierColor = Colors.black54,
bool? useSafeArea,
bool? useRootNavigator,
Widget? contentWidget,
List<DialogAction> options = const [DialogAction(text: '知道了')]}) {
return showDialog(
context: context,
barrierDismissible: barrierDismissible,
barrierColor: barrierColor,
useSafeArea: useSafeArea ?? true,
useRootNavigator: useRootNavigator ?? true,
builder: (BuildContext context) => HDialogWidget(
title: title,
content: content,
contentWidget: contentWidget,
options: options,
isSheetStyle: false,
));
}
}
class DialogAction<T> {
final String? text;
final ActionType type;
final Widget? child;
final T? actionValue;
final VoidCallback? onPressed;
const DialogAction(
{this.text,
this.type = ActionType.positive,
this.child,
this.actionValue,
this.onPressed});
}
enum ActionType { delete, positive, negative }
Color _getActionColor(ActionType type) {
switch (type) {
case ActionType.delete:
return HColors.secondary;
case ActionType.negative:
return HColors.mediumGrey;
case ActionType.positive:
return HColors.primary;
default:
return HColors.primary;
}
}
class HDialogWidget<T> extends StatelessWidget {
final String? title;
final String? content;
final Widget? contentWidget;
final List<DialogAction<T>> options;
final DialogAction<T>? bottomSheetCancel;
final bool isSheetStyle;
const HDialogWidget(
{Key? key,
this.title,
this.content,
this.contentWidget,
this.options = const [],
this.bottomSheetCancel,
this.isSheetStyle = false})
: super(key: key);
@override
Widget build(BuildContext context) {
if (Platform.isIOS) {
return createIOSDialog(
content: content,
contentWidget: contentWidget,
title: title,
context: context,
options: options);
} else {
return createAndroidDialog(
content: content,
contentWidget: contentWidget,
title: title,
context: context,
options: options);
}
}
AlertDialog createAndroidDialog<T>(
{required BuildContext context,
String? title,
String? content,
required List<DialogAction<T>> options,
Widget? contentWidget}) {
final actions = options.map((option) {
return CupertinoButton(
onPressed: () {
Navigator.pop(context, option.actionValue);
if (option.onPressed != null) option.onPressed!();
},
child: option.child ??
Text(option.text ?? '',
style: TextStyle(color: _getActionColor(option.type))));
}).toList();
final dialog = AlertDialog(
title: title==null ? null : Text(title),
content: contentWidget != null && content==null
? contentWidget
: Text(content ?? ''),
actions: actions,
);
return dialog;
}
Widget createIOSDialog<T>(
{required BuildContext context,
String? title,
String? content,
Widget? contentWidget,
required List<DialogAction<T>> options}) {
final actions = options.map((option) {
return CupertinoButton(
onPressed: () {
Navigator.pop(context, option.actionValue);
if (option.onPressed != null) option.onPressed!();
},
child: option.child ??
Text(option.text ?? '',
style: TextStyle(color: _getActionColor(option.type))),
);
}).toList();
return CupertinoAlertDialog(
title: title==null ? null : Text(title),
content: contentWidget != null && content == null
? contentWidget
: Text(content ?? ''),
actions: actions,
);
}
Widget createIOSSheetDialog<T>(
{required BuildContext context,
String? title,
String? content,
Widget? contentWidget,
required List<DialogAction<T>> options,
DialogAction<T>? bottomSheetCancel}) {
final actions = options.map((option) {
return CupertinoActionSheetAction(
onPressed: () {
Navigator.pop(context, option.actionValue);
if (option.onPressed != null) option.onPressed!();
},
child: option.child ??
Text(option.text ?? '',
style: TextStyle(color: _getActionColor(option.type))));
}).toList();
final cancelButton = bottomSheetCancel == null
? null
: CupertinoActionSheetAction(
onPressed: () {
Navigator.pop(context, bottomSheetCancel.actionValue);
if (bottomSheetCancel.onPressed != null)
bottomSheetCancel.onPressed!();
},
isDefaultAction: true,
child: bottomSheetCancel.child ??
Text(bottomSheetCancel.text ?? '',
style: TextStyle(
color: _getActionColor(bottomSheetCancel.type))),
);
return CupertinoActionSheet(
title: title==null ? null : Text(title),
message: contentWidget != null && content==null
? contentWidget
: Text(content ?? ''),
actions: actions,
cancelButton: cancelButton);
}
}