showDialog< T> function
Displays a Material dialog above the current contents of the app, with Material entrance and exit animations, modal barrier color, and modal barrier behavior (dialog is dismissible with a tap on the barrier).
This function takes a builder
which typically builds a Dialog widget.
Content below the dialog is dimmed with a ModalBarrier. The widget
returned by the builder
does not share a context with the location that
showDialog
is originally called from. Use a StatefulBuilder or a
custom StatefulWidget if the dialog needs to update dynamically.
The context
argument is used to look up the Navigator and Theme for
the dialog. It is only used when the method is called. Its corresponding
widget can be safely removed from the tree before the dialog is closed.
The child
argument is deprecated, and should be replaced with builder
.
Returns a Future that resolves to the value (if any) that was passed to Navigator.pop when the dialog was closed.
The dialog route created by this method is pushed to the root navigator.
If the application has multiple Navigator objects, it may be necessary to
call Navigator.of(context, rootNavigator: true).pop(result)
to close the
dialog rather than just Navigator.pop(context, result)
.
See also:
- AlertDialog, for dialogs that have a row of buttons below a body.
- SimpleDialog, which handles the scrolling of the contents and does not show buttons below its body.
- Dialog, on which SimpleDialog and AlertDialog are based.
- showCupertinoDialog, which displays an iOS-style dialog.
- showGeneralDialog, which allows for customization of the dialog popup.
- material.google.com/components/dialogs.html
Implementation
Future<T> showDialog<T>({
@required BuildContext context,
bool barrierDismissible = true,
@Deprecated(
'Instead of using the "child" argument, return the child from a closure '
'provided to the "builder" argument. This will ensure that the BuildContext '
'is appropriate for widgets built in the dialog.'
) Widget child,
WidgetBuilder builder,
}) {
assert(child == null || builder == null);
assert(debugCheckHasMaterialLocalizations(context));
return showGeneralDialog(
context: context,
pageBuilder: (BuildContext buildContext, Animation<double> animation, Animation<double> secondaryAnimation) {
final ThemeData theme = Theme.of(context, shadowThemeOnly: true);
final Widget pageChild = child ?? Builder(builder: builder);
return SafeArea(
child: Builder(
builder: (BuildContext context) {
return theme != null
? Theme(data: theme, child: pageChild)
: pageChild;
}
),
);
},
barrierDismissible: barrierDismissible,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
barrierColor: Colors.black54,
transitionDuration: const Duration(milliseconds: 150),
transitionBuilder: _buildMaterialDialogTransitions,
);
}