Unverified Commit 7a83c6fc authored by Darren Austin's avatar Darren Austin Committed by GitHub

Expose insetPadding and clipBehavior in Dialog and AlertDialog. (#50775)

parent 85b54d4c
...@@ -26,6 +26,8 @@ import 'theme_data.dart'; ...@@ -26,6 +26,8 @@ import 'theme_data.dart';
// enum Department { treasury, state } // enum Department { treasury, state }
// BuildContext context; // BuildContext context;
const EdgeInsets _defaultInsetPadding = EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0);
/// A material design dialog. /// A material design dialog.
/// ///
/// This dialog widget does not have any opinion about the contents of the /// This dialog widget does not have any opinion about the contents of the
...@@ -49,9 +51,12 @@ class Dialog extends StatelessWidget { ...@@ -49,9 +51,12 @@ class Dialog extends StatelessWidget {
this.elevation, this.elevation,
this.insetAnimationDuration = const Duration(milliseconds: 100), this.insetAnimationDuration = const Duration(milliseconds: 100),
this.insetAnimationCurve = Curves.decelerate, this.insetAnimationCurve = Curves.decelerate,
this.insetPadding = _defaultInsetPadding,
this.clipBehavior = Clip.none,
this.shape, this.shape,
this.child, this.child,
}) : super(key: key); }) : assert(clipBehavior != null),
super(key: key);
/// {@template flutter.material.dialog.backgroundColor} /// {@template flutter.material.dialog.backgroundColor}
/// The background color of the surface of this [Dialog]. /// The background color of the surface of this [Dialog].
...@@ -87,6 +92,26 @@ class Dialog extends StatelessWidget { ...@@ -87,6 +92,26 @@ class Dialog extends StatelessWidget {
/// {@endtemplate} /// {@endtemplate}
final Curve insetAnimationCurve; final Curve insetAnimationCurve;
/// {@template flutter.material.dialog.insetPadding}
/// The amount of padding added to [MediaQueryData.viewInsets] on the outside
/// of the dialog. This defines the minimum space between the screen's edges
/// and the dialog.
///
/// Defaults to `EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0)`.
/// {@endtemplate}
final EdgeInsets insetPadding;
/// {@template flutter.material.dialog.clipBehavior}
/// Controls how the contents of the dialog are clipped (or not) to the given
/// [shape].
///
/// See the enum [Clip] for details of all possible options and their common
/// use cases.
///
/// Defaults to [Clip.none], and must not be null.
/// {@endtemplate}
final Clip clipBehavior;
/// {@template flutter.material.dialog.shape} /// {@template flutter.material.dialog.shape}
/// The shape of this dialog's border. /// The shape of this dialog's border.
/// ///
...@@ -109,8 +134,9 @@ class Dialog extends StatelessWidget { ...@@ -109,8 +134,9 @@ class Dialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final DialogTheme dialogTheme = DialogTheme.of(context); final DialogTheme dialogTheme = DialogTheme.of(context);
final EdgeInsets effectivePadding = MediaQuery.of(context).viewInsets + (insetPadding ?? const EdgeInsets.all(0.0));
return AnimatedPadding( return AnimatedPadding(
padding: MediaQuery.of(context).viewInsets + const EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0), padding: effectivePadding,
duration: insetAnimationDuration, duration: insetAnimationDuration,
curve: insetAnimationCurve, curve: insetAnimationCurve,
child: MediaQuery.removeViewInsets( child: MediaQuery.removeViewInsets(
...@@ -127,6 +153,7 @@ class Dialog extends StatelessWidget { ...@@ -127,6 +153,7 @@ class Dialog extends StatelessWidget {
elevation: elevation ?? dialogTheme.elevation ?? _defaultElevation, elevation: elevation ?? dialogTheme.elevation ?? _defaultElevation,
shape: shape ?? dialogTheme.shape ?? _defaultDialogShape, shape: shape ?? dialogTheme.shape ?? _defaultDialogShape,
type: MaterialType.card, type: MaterialType.card,
clipBehavior: clipBehavior,
child: child, child: child,
), ),
), ),
...@@ -229,9 +256,12 @@ class AlertDialog extends StatelessWidget { ...@@ -229,9 +256,12 @@ class AlertDialog extends StatelessWidget {
this.backgroundColor, this.backgroundColor,
this.elevation, this.elevation,
this.semanticLabel, this.semanticLabel,
this.insetPadding = _defaultInsetPadding,
this.clipBehavior = Clip.none,
this.shape, this.shape,
this.scrollable = false, this.scrollable = false,
}) : assert(contentPadding != null), }) : assert(contentPadding != null),
assert(clipBehavior != null),
super(key: key); super(key: key);
/// The (optional) title of the dialog is displayed in a large font at the top /// The (optional) title of the dialog is displayed in a large font at the top
...@@ -394,6 +424,12 @@ class AlertDialog extends StatelessWidget { ...@@ -394,6 +424,12 @@ class AlertDialog extends StatelessWidget {
/// value is used. /// value is used.
final String semanticLabel; final String semanticLabel;
/// {@macro flutter.material.dialog.insetPadding}
final EdgeInsets insetPadding;
/// {@macro flutter.material.dialog.clipBehavior}
final Clip clipBehavior;
/// {@macro flutter.material.dialog.shape} /// {@macro flutter.material.dialog.shape}
final ShapeBorder shape; final ShapeBorder shape;
...@@ -518,6 +554,8 @@ class AlertDialog extends StatelessWidget { ...@@ -518,6 +554,8 @@ class AlertDialog extends StatelessWidget {
return Dialog( return Dialog(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
elevation: elevation, elevation: elevation,
insetPadding: insetPadding,
clipBehavior: clipBehavior,
shape: shape, shape: shape,
child: dialogChild, child: dialogChild,
); );
......
...@@ -155,6 +155,20 @@ void main() { ...@@ -155,6 +155,20 @@ void main() {
expect(content.text.style, contentTextStyle); expect(content.text.style, contentTextStyle);
}); });
testWidgets('Custom clipBehavior', (WidgetTester tester) async {
const AlertDialog dialog = AlertDialog(
actions: <Widget>[],
clipBehavior: Clip.antiAlias,
);
await tester.pumpWidget(_buildAppWithDialog(dialog));
await tester.tap(find.text('X'));
await tester.pumpAndSettle();
final Material materialWidget = _getMaterialFromDialog(tester);
expect(materialWidget.clipBehavior, Clip.antiAlias);
});
testWidgets('Custom dialog shape', (WidgetTester tester) async { testWidgets('Custom dialog shape', (WidgetTester tester) async {
const RoundedRectangleBorder customBorder = const RoundedRectangleBorder customBorder =
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0))); RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0)));
...@@ -750,6 +764,47 @@ void main() { ...@@ -750,6 +764,47 @@ void main() {
); );
}); });
testWidgets('Dialog insetPadding added to outside of dialog', (WidgetTester tester) async {
// The default testing screen (800, 600)
const Rect screenRect = Rect.fromLTRB(0.0, 0.0, 800.0, 600.0);
// Test with no padding
await tester.pumpWidget(
const MediaQuery(
data: MediaQueryData(
viewInsets: EdgeInsets.all(0.0),
),
child: Dialog(
child: Placeholder(),
insetPadding: null,
),
),
);
await tester.pumpAndSettle();
expect(tester.getRect(find.byType(Placeholder)), screenRect);
// Test with an insetPadding
await tester.pumpWidget(
const MediaQuery(
data: MediaQueryData(
viewInsets: EdgeInsets.all(0.0),
),
child: Dialog(
insetPadding: EdgeInsets.fromLTRB(10.0, 20.0, 30.0, 40.0),
child: Placeholder(),
),
),
);
await tester.pumpAndSettle();
expect(tester.getRect(find.byType(Placeholder)),
Rect.fromLTRB(
screenRect.left + 10.0,
screenRect.top + 20.0,
screenRect.right - 30.0,
screenRect.bottom - 40.0,
));
});
testWidgets('Dialog widget contains route semantics from title', (WidgetTester tester) async { testWidgets('Dialog widget contains route semantics from title', (WidgetTester tester) async {
final SemanticsTester semantics = SemanticsTester(tester); final SemanticsTester semantics = SemanticsTester(tester);
await tester.pumpWidget( await tester.pumpWidget(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment