submitting_dialog.dart 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import 'package:flutter/material.dart';
  2. import 'package:tdesign_flutter/tdesign_flutter.dart';
  3. import '../../core/theme/app_colors_extension.dart';
  4. import '../../core/i18n/app_localizations.dart';
  5. /// 提交中 loading 弹窗。
  6. ///
  7. /// 方形卡片,上方菊花动画,下方文字。
  8. /// 使用方式:
  9. /// ```dart
  10. /// SubmittingDialog.show(context);
  11. /// // ... 异步操作 ...
  12. /// SubmittingDialog.hide(context);
  13. /// ```
  14. class SubmittingDialog {
  15. SubmittingDialog._();
  16. /// 显示提交中弹窗。返回按钮可关闭(关闭后 API 请求仍在进行)。
  17. static void show(BuildContext context) {
  18. showDialog(
  19. context: context,
  20. barrierDismissible: false,
  21. builder: (_) => _SubmittingContent(),
  22. );
  23. }
  24. /// 关闭提交中弹窗。即使弹窗已被返回键关闭也不会抛异常。
  25. static void hide(BuildContext context) {
  26. Navigator.of(context).maybePop();
  27. }
  28. }
  29. class _SubmittingContent extends StatelessWidget {
  30. @override
  31. Widget build(BuildContext context) {
  32. final l10n = AppLocalizations.of(context);
  33. final colors = Theme.of(context).extension<AppColorsExtension>()!;
  34. return Center(
  35. child: Container(
  36. width: 120,
  37. padding: const EdgeInsets.fromLTRB(24, 28, 24, 24),
  38. decoration: BoxDecoration(
  39. color: colors.bgCard,
  40. borderRadius: BorderRadius.circular(12),
  41. ),
  42. child: Column(
  43. mainAxisSize: MainAxisSize.min,
  44. children: [
  45. const TDLoading(
  46. size: TDLoadingSize.large,
  47. icon: TDLoadingIcon.activity,
  48. ),
  49. const SizedBox(height: 16),
  50. Text(
  51. l10n.get('submitting'),
  52. style: TextStyle(
  53. fontSize: 14,
  54. fontWeight: FontWeight.w500,
  55. color: colors.textSecondary,
  56. ),
  57. ),
  58. ],
  59. ),
  60. ),
  61. );
  62. }
  63. }