From a425e56252e315bdf0ac2378ad8be3801d1fdc76 Mon Sep 17 00:00:00 2001 From: Polina Cherkasova Date: Tue, 5 Sep 2023 14:03:54 -0700 Subject: [PATCH] Revert "CupertinoAlertDialog should not create ScrollController on every build, if null values are passed in constructor." (#134071) Reverts flutter/flutter#133918 as it causes build failures. --- .../flutter/lib/src/cupertino/dialog.dart | 48 +++++++------------ .../flutter/test/material/dialog_test.dart | 2 +- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/packages/flutter/lib/src/cupertino/dialog.dart b/packages/flutter/lib/src/cupertino/dialog.dart index 2e4d27af7574..ef8c10936043 100644 --- a/packages/flutter/lib/src/cupertino/dialog.dart +++ b/packages/flutter/lib/src/cupertino/dialog.dart @@ -188,7 +188,7 @@ bool _isInAccessibilityMode(BuildContext context) { /// * [CupertinoDialogAction], which is an iOS-style dialog button. /// * [AlertDialog], a Material Design alert dialog. /// * -class CupertinoAlertDialog extends StatefulWidget { +class CupertinoAlertDialog extends StatelessWidget { /// Creates an iOS-style alert dialog. /// /// The [actions] must not be null. @@ -233,6 +233,9 @@ class CupertinoAlertDialog extends StatefulWidget { /// section when there are many actions. final ScrollController? scrollController; + ScrollController get _effectiveScrollController => + scrollController ?? ScrollController(); + /// A scroll controller that can be used to control the scrolling of the /// actions in the dialog. /// @@ -244,49 +247,37 @@ class CupertinoAlertDialog extends StatefulWidget { /// section when it is long. final ScrollController? actionScrollController; + ScrollController get _effectiveActionScrollController => + actionScrollController ?? ScrollController(); + /// {@macro flutter.material.dialog.insetAnimationDuration} final Duration insetAnimationDuration; /// {@macro flutter.material.dialog.insetAnimationCurve} final Curve insetAnimationCurve; - @override - State createState() => _CupertinoAlertDialogState(); -} - -class _CupertinoAlertDialogState extends State { - ScrollController? _backupScrollController; - - ScrollController? _backupActionScrollController; - - ScrollController get _effectiveScrollController => - widget.scrollController ?? (_backupScrollController ??= ScrollController()); - - ScrollController get _effectiveActionScrollController => - widget.actionScrollController ?? (_backupActionScrollController ??= ScrollController()); - Widget _buildContent(BuildContext context) { final double textScaleFactor = MediaQuery.textScalerOf(context).textScaleFactor; final List children = [ - if (widget.title != null || widget.content != null) + if (title != null || content != null) Flexible( flex: 3, child: _CupertinoAlertContentSection( - title: widget.title, - message: widget.content, + title: title, + message: content, scrollController: _effectiveScrollController, titlePadding: EdgeInsets.only( left: _kDialogEdgePadding, right: _kDialogEdgePadding, - bottom: widget.content == null ? _kDialogEdgePadding : 1.0, + bottom: content == null ? _kDialogEdgePadding : 1.0, top: _kDialogEdgePadding * textScaleFactor, ), messagePadding: EdgeInsets.only( left: _kDialogEdgePadding, right: _kDialogEdgePadding, bottom: _kDialogEdgePadding * textScaleFactor, - top: widget.title == null ? _kDialogEdgePadding : 1.0, + top: title == null ? _kDialogEdgePadding : 1.0, ), titleTextStyle: _kCupertinoDialogTitleStyle.copyWith( color: CupertinoDynamicColor.resolve(CupertinoColors.label, context), @@ -312,10 +303,10 @@ class _CupertinoAlertDialogState extends State { Widget actionSection = Container( height: 0.0, ); - if (widget.actions.isNotEmpty) { + if (actions.isNotEmpty) { actionSection = _CupertinoAlertActionSection( scrollController: _effectiveActionScrollController, - children: widget.actions, + children: actions, ); } @@ -339,8 +330,8 @@ class _CupertinoAlertDialogState extends State { return AnimatedPadding( padding: MediaQuery.viewInsetsOf(context) + const EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0), - duration: widget.insetAnimationDuration, - curve: widget.insetAnimationCurve, + duration: insetAnimationDuration, + curve: insetAnimationCurve, child: MediaQuery.removeViewInsets( removeLeft: true, removeTop: true, @@ -377,13 +368,6 @@ class _CupertinoAlertDialogState extends State { ), ); } - - @override - void dispose() { - _backupScrollController?.dispose(); - _backupActionScrollController?.dispose(); - super.dispose(); - } } /// Rounded rectangle surface that looks like an iOS popup surface, e.g., alert dialog diff --git a/packages/flutter/test/material/dialog_test.dart b/packages/flutter/test/material/dialog_test.dart index 0a162059412d..98755d1daea0 100644 --- a/packages/flutter/test/material/dialog_test.dart +++ b/packages/flutter/test/material/dialog_test.dart @@ -2664,7 +2664,7 @@ void main() { okNode.dispose(); }); - testWidgetsWithLeakTracking('Adaptive AlertDialog shows correct widget on each platform', (WidgetTester tester) async { + testWidgets('Adaptive AlertDialog shows correct widget on each platform', (WidgetTester tester) async { final AlertDialog dialog = AlertDialog.adaptive( content: Container( height: 5000.0,