Revert "Implement AlertDialog title/content overflow scroll #43226" (#44003)
diff --git a/packages/flutter/lib/src/material/dialog.dart b/packages/flutter/lib/src/material/dialog.dart
index de0c52a..4937944 100644
--- a/packages/flutter/lib/src/material/dialog.dart
+++ b/packages/flutter/lib/src/material/dialog.dart
@@ -133,6 +133,15 @@
/// of actions. The title is displayed above the content and the actions are
/// displayed below the content.
///
+/// If the content is too large to fit on the screen vertically, the dialog will
+/// display the title and the actions and let the content overflow, which is
+/// rarely desired. Consider using a scrolling widget for [content], such as
+/// [SingleChildScrollView], to avoid overflow. (However, be aware that since
+/// [AlertDialog] tries to size itself using the intrinsic dimensions of its
+/// children, widgets such as [ListView], [GridView], and [CustomScrollView],
+/// which use lazy viewports, will not work. If this is a problem, consider
+/// using [Dialog] directly.)
+///
/// For dialogs that offer the user a choice between several options, consider
/// using a [SimpleDialog].
///
@@ -152,11 +161,13 @@
/// builder: (BuildContext context) {
/// return AlertDialog(
/// title: Text('Rewind and remember'),
-/// content: Column(
-/// children: <Widget>[
-/// Text('You will never be satisfied.'),
-/// Text('You\’re like me. I’m never satisfied.'),
-/// ],
+/// content: SingleChildScrollView(
+/// child: ListBody(
+/// children: <Widget>[
+/// Text('You will never be satisfied.'),
+/// Text('You\’re like me. I’m never satisfied.'),
+/// ],
+/// ),
/// ),
/// actions: <Widget>[
/// FlatButton(
@@ -310,34 +321,25 @@
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
- if (title != null || content != null)
+ if (title != null)
+ Padding(
+ padding: titlePadding ?? EdgeInsets.fromLTRB(24.0, 24.0, 24.0, content == null ? 20.0 : 0.0),
+ child: DefaultTextStyle(
+ style: titleTextStyle ?? dialogTheme.titleTextStyle ?? theme.textTheme.title,
+ child: Semantics(
+ child: title,
+ namesRoute: true,
+ container: true,
+ ),
+ ),
+ ),
+ if (content != null)
Flexible(
- child: SingleChildScrollView(
- child: Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: <Widget>[
- if (title != null)
- Padding(
- padding: titlePadding ?? EdgeInsets.fromLTRB(24.0, 24.0, 24.0, content == null ? 20.0 : 0.0),
- child: DefaultTextStyle(
- style: titleTextStyle ?? dialogTheme.titleTextStyle ?? theme.textTheme.title,
- child: Semantics(
- child: title,
- namesRoute: true,
- container: true,
- ),
- ),
- ),
- if (content != null)
- Padding(
- padding: contentPadding,
- child: DefaultTextStyle(
- style: contentTextStyle ?? dialogTheme.contentTextStyle ?? theme.textTheme.subhead,
- child: content,
- ),
- ),
- ],
+ child: Padding(
+ padding: contentPadding,
+ child: DefaultTextStyle(
+ style: contentTextStyle ?? dialogTheme.contentTextStyle ?? theme.textTheme.subhead,
+ child: content,
),
),
),
diff --git a/packages/flutter/test/material/dialog_test.dart b/packages/flutter/test/material/dialog_test.dart
index 0143eaa..9d89e73 100644
--- a/packages/flutter/test/material/dialog_test.dart
+++ b/packages/flutter/test/material/dialog_test.dart
@@ -716,83 +716,6 @@
expect(rootObserver.dialogCount, 0);
expect(nestedObserver.dialogCount, 1);
});
-
- group('Scrollable title and content', () {
- testWidgets('Title is scrollable', (WidgetTester tester) async {
- final Key titleKey = UniqueKey();
- final AlertDialog dialog = AlertDialog(
- title: Container(
- key: titleKey,
- color: Colors.green,
- height: 1000,
- ),
- );
- await tester.pumpWidget(_appWithAlertDialog(tester, dialog));
- await tester.tap(find.text('X'));
- await tester.pumpAndSettle();
-
- final RenderBox box = tester.renderObject(find.byKey(titleKey));
- final Offset originalOffset = box.localToGlobal(Offset.zero);
- await tester.drag(find.byKey(titleKey), const Offset(0.0, -200.0));
- expect(box.localToGlobal(Offset.zero), equals(originalOffset.translate(0.0, -200.0)));
- });
-
- testWidgets('Content is scrollable', (WidgetTester tester) async {
- final Key contentKey = UniqueKey();
- final AlertDialog dialog = AlertDialog(
- content: Container(
- key: contentKey,
- color: Colors.orange,
- height: 1000,
- ),
- );
- await tester.pumpWidget(_appWithAlertDialog(tester, dialog));
- await tester.tap(find.text('X'));
- await tester.pumpAndSettle();
-
- final RenderBox box = tester.renderObject(find.byKey(contentKey));
- final Offset originalOffset = box.localToGlobal(Offset.zero);
- await tester.drag(find.byKey(contentKey), const Offset(0.0, -200.0));
- expect(box.localToGlobal(Offset.zero), equals(originalOffset.translate(0.0, -200.0)));
- });
-
- testWidgets('Title and content are scrollable', (WidgetTester tester) async {
- final Key titleKey = UniqueKey();
- final Key contentKey = UniqueKey();
- final AlertDialog dialog = AlertDialog(
- title: Container(
- key: titleKey,
- color: Colors.green,
- height: 400,
- ),
- content: Container(
- key: contentKey,
- color: Colors.orange,
- height: 400,
- ),
- );
- await tester.pumpWidget(_appWithAlertDialog(tester, dialog));
- await tester.tap(find.text('X'));
- await tester.pumpAndSettle();
-
- final RenderBox title = tester.renderObject(find.byKey(titleKey));
- final RenderBox content = tester.renderObject(find.byKey(contentKey));
- final Offset titleOriginalOffset = title.localToGlobal(Offset.zero);
- final Offset contentOriginalOffset = content.localToGlobal(Offset.zero);
-
- // Dragging the title widget should scroll both the title
- // and the content widgets.
- await tester.drag(find.byKey(titleKey), const Offset(0.0, -200.0));
- expect(title.localToGlobal(Offset.zero), equals(titleOriginalOffset.translate(0.0, -200.0)));
- expect(content.localToGlobal(Offset.zero), equals(contentOriginalOffset.translate(0.0, -200.0)));
-
- // Dragging the content widget should scroll both the title
- // and the content widgets.
- await tester.drag(find.byKey(contentKey), const Offset(0.0, 200.0));
- expect(title.localToGlobal(Offset.zero), equals(titleOriginalOffset));
- expect(content.localToGlobal(Offset.zero), equals(contentOriginalOffset));
- });
- });
}
class DialogObserver extends NavigatorObserver {