import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class Dialogs { static CustomDialog normalProgressDialog(String message) { return CustomDialog( child: Container( height: 150, alignment: Alignment.center, child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ SizedBox( width: 20.0, height: 20.0, child: CircularProgressIndicator( strokeWidth: 2.0, ), ), Text(' $message'), ], ), ), ); } static Future<T> showNormalProgressDialog<T>(BuildContext context, String message, AsyncValueGetter<T> callback) async { T result; bool isDialogShowing = false; BuildContext _context; showDialog( context: context, barrierDismissible: false, builder: (context) { _context = context; return WillPopScope( child: Dialogs.normalProgressDialog(message), onWillPop: () { return Future.value(!isDialogShowing); }); }); if (callback != null) result = await callback(); isDialogShowing = false; if (_context != null) { Navigator.pop(_context); } else { Navigator.pop(context); } return result; } } class CustomDialog extends StatelessWidget { /// Creates a dialog. /// /// Typically used in conjunction with [showDialog]. const CustomDialog({ Key key, this.backgroundColor, this.elevation, this.insetAnimationDuration = const Duration(milliseconds: 100), this.insetAnimationCurve = Curves.decelerate, this.shape, this.child, this.padding = const EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0), }) : super(key: key); /// {@template flutter.material.dialog.backgroundColor} /// The background color of the surface of this [CustomDialog]. /// /// This sets the [Material.color] on this [CustomDialog]'s [Material]. /// /// If `null`, [ThemeData.cardColor] is used. /// {@endtemplate} final Color backgroundColor; /// {@template flutter.material.dialog.elevation} /// The z-coordinate of this [CustomDialog]. /// /// If null then [DialogTheme.elevation] is used, and if that's null then the /// dialog's elevation is 24.0. /// {@endtemplate} /// {@macro flutter.material.material.elevation} final double elevation; /// The duration of the animation to show when the system keyboard intrudes /// into the space that the dialog is placed in. /// /// Defaults to 100 milliseconds. final Duration insetAnimationDuration; /// The curve to use for the animation shown when the system keyboard intrudes /// into the space that the dialog is placed in. /// /// Defaults to [Curves.fastOutSlowIn]. final Curve insetAnimationCurve; /// {@template flutter.material.dialog.shape} /// The shape of this dialog's border. /// /// Defines the dialog's [Material.shape]. /// /// The default shape is a [RoundedRectangleBorder] with a radius of 2.0. /// {@endtemplate} final ShapeBorder shape; /// The widget below this widget in the tree. /// /// {@macro flutter.widgets.child} final Widget child; /// The amount of space by which to inset the child. final EdgeInsetsGeometry padding; static const RoundedRectangleBorder _defaultDialogShape = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(2.0))); static const double _defaultElevation = 24.0; @override Widget build(BuildContext context) { final DialogTheme dialogTheme = DialogTheme.of(context); return AnimatedPadding( padding: MediaQuery.of(context).viewInsets + padding, duration: insetAnimationDuration, curve: insetAnimationCurve, child: MediaQuery.removeViewInsets( removeLeft: true, removeTop: true, removeRight: true, removeBottom: true, context: context, child: Center( child: ConstrainedBox( constraints: const BoxConstraints(minWidth: 280.0), child: Material( color: backgroundColor ?? dialogTheme.backgroundColor ?? Theme.of(context).dialogBackgroundColor, elevation: elevation ?? dialogTheme.elevation ?? _defaultElevation, shape: shape ?? dialogTheme.shape ?? _defaultDialogShape, type: MaterialType.card, child: child, ), ), ), ), ); } }
使用:
ListTile( leading: Text("弹窗提示"), onTap: () async { await Dialogs.showNormalProgressDialog(context, '加载中,请稍后。。。', () async { try { // todo 网络请求处理,耗时操作等 setState(() {}); } catch (error) { // todo 错误提示 } }); }, ),
来源:https://www.cnblogs.com/loaderman/p/12304083.html