alert_dialog.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import 'package:electronic_assistant/utils/expand.dart';
  2. import 'package:flutter/cupertino.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/widgets.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  7. class EAAlertDialog {
  8. static Future<T?> show<T>({
  9. String? title,
  10. String? contentText,
  11. Widget? contentWidget,
  12. String? confirmText,
  13. String? cancelText,
  14. VoidCallback? cancelOnTap,
  15. VoidCallback? confirmOnTap,
  16. VoidCallback? onDismiss,
  17. }) {
  18. return SmartDialog.show<T>(
  19. builder: (_) {
  20. return _EAAlertDialog(
  21. title: title,
  22. content: contentText,
  23. contentWidget: contentWidget,
  24. confirmText: confirmText,
  25. cancelText: cancelText,
  26. confirmOnTap: confirmOnTap,
  27. cancelOnTap: cancelOnTap);
  28. },
  29. tag: "EAAlertDialog",
  30. onDismiss: onDismiss,
  31. clickMaskDismiss: false,
  32. );
  33. }
  34. static void dismiss<T>({T? result}) {
  35. SmartDialog.dismiss(tag: "EAAlertDialog", result: result);
  36. }
  37. }
  38. class _EAAlertDialog extends Dialog {
  39. // 标题
  40. final String? title;
  41. final Widget? contentWidget;
  42. // 内容
  43. final String? content;
  44. // 取消按钮文字
  45. final String? cancelText;
  46. // 取消按钮回调
  47. final VoidCallback? cancelOnTap;
  48. // 确认按钮文字
  49. final String? confirmText;
  50. // 确认按钮文字回调
  51. final VoidCallback? confirmOnTap;
  52. const _EAAlertDialog({
  53. this.title,
  54. this.content,
  55. this.contentWidget,
  56. required this.cancelText,
  57. required this.confirmText,
  58. this.cancelOnTap,
  59. this.confirmOnTap,
  60. });
  61. @override
  62. Widget build(BuildContext context) {
  63. return Center(
  64. child: Column(
  65. children: [
  66. const Spacer(),
  67. Container(
  68. alignment: Alignment.center,
  69. padding: EdgeInsets.symmetric(vertical: 24.h, horizontal: 16.w),
  70. width: ScreenUtil().screenWidth - 80.w,
  71. decoration: BoxDecoration(
  72. borderRadius: BorderRadius.all(Radius.circular(12.w)),
  73. color: "#FFFFFF".toColor(),
  74. ),
  75. child: Column(
  76. mainAxisAlignment: MainAxisAlignment.center,
  77. children: [
  78. /// 标题
  79. if (title != null)
  80. Text(
  81. title!,
  82. style: TextStyle(
  83. color: "#25262A".toColor(),
  84. fontSize: 15.sp,
  85. fontWeight: FontWeight.w500,
  86. decoration: TextDecoration.none,
  87. ),
  88. ),
  89. if (title != null) SizedBox(height: 12.h),
  90. if (content != null)
  91. /// 内容
  92. Text(
  93. content ?? "",
  94. textAlign: TextAlign.center,
  95. style: TextStyle(
  96. color: "#5F5F61".toColor(),
  97. fontWeight: FontWeight.w500,
  98. fontSize: 14.sp,
  99. decoration: TextDecoration.none,
  100. ),
  101. ),
  102. if (contentWidget != null) contentWidget!,
  103. SizedBox(height: 34.h),
  104. ///
  105. _buttonWidget(context),
  106. ],
  107. ),
  108. ),
  109. //
  110. const Spacer(),
  111. ],
  112. ),
  113. );
  114. }
  115. Widget _buttonWidget(BuildContext context) {
  116. if (cancelText == null) {
  117. return Row(
  118. children: [
  119. const Spacer(),
  120. ///确认按钮
  121. GestureDetector(
  122. onTap: () {
  123. _clickConfirm();
  124. },
  125. child: _button(text: confirmText ?? "", color: "#6177F2".toColor()),
  126. ),
  127. //
  128. const Spacer(),
  129. ],
  130. );
  131. } else {
  132. return Row(
  133. children: [
  134. /// 取消按钮
  135. Expanded(
  136. child: InkWell(
  137. onTap: () {
  138. _clickCancel();
  139. },
  140. child: _button(
  141. text: cancelText ?? "",
  142. color: "#F0F0F0".toColor(),
  143. textColor: "#5F5F61".toColor(),
  144. ),
  145. ),
  146. ),
  147. ///
  148. const SizedBox(width: 8),
  149. /// 确认按钮
  150. Expanded(
  151. child: InkWell(
  152. onTap: () {
  153. _clickConfirm();
  154. },
  155. child:
  156. _button(text: confirmText ?? "", color: "#6177F2".toColor()),
  157. ),
  158. ),
  159. ],
  160. );
  161. }
  162. }
  163. Widget _button({
  164. required String text,
  165. Color? color,
  166. BoxBorder? border,
  167. Color? textColor = Colors.white,
  168. }) {
  169. return Container(
  170. height: 36.w,
  171. decoration: BoxDecoration(
  172. borderRadius: BorderRadius.all(Radius.circular(8.w)),
  173. color: color,
  174. border: border,
  175. ),
  176. alignment: Alignment.center,
  177. child: Text(
  178. text,
  179. style: TextStyle(
  180. color: textColor,
  181. fontSize: 14.sp,
  182. fontWeight: FontWeight.w500,
  183. ),
  184. ),
  185. );
  186. }
  187. void _clickConfirm() {
  188. if (confirmOnTap != null) {
  189. confirmOnTap!();
  190. }
  191. EAAlertDialog.dismiss();
  192. }
  193. void _clickCancel() {
  194. if (cancelOnTap != null) {
  195. cancelOnTap!();
  196. }
  197. EAAlertDialog.dismiss();
  198. }
  199. }