From b714d8b34cd7b05ba109448ff1d9a31a69db5f32 Mon Sep 17 00:00:00 2001 From: masato Date: Thu, 1 May 2025 03:43:49 +0900 Subject: [PATCH] Add barrierColor property to showCupertinoDialog (#166911) implimented https://github.com/flutter/flutter/issues/166910 https://github.com/user-attachments/assets/fe9aa2ce-b8a5-4458-b04a-781763959169 ## How to Verify - Set enableDrag: false in CupertinoSheetRoute or showCupertinoSheet. ```diff showCupertinoDialog( context: context, + barrierColor: CupertinoColors.activeOrange.withValues(alpha: 0.5), builder: (BuildContext context) => CupertinoAlertDialog( title: const Text('Alert'), content: const Text('Proceed with destructive action?'), actions: [ CupertinoDialogAction( /// This parameter indicates this action is the default, /// and turns the action's text to bold text. isDefaultAction: true, onPressed: () { Navigator.pop(context); }, child: const Text('No'), ), CupertinoDialogAction( /// This parameter indicates the action would perform /// a destructive action such as deletion, and turns /// the action's text color to red. isDestructiveAction: true, onPressed: () { Navigator.pop(context); }, child: const Text('Yes'), ), ], ), ); ``` - The following is a screenshot of `examples/api/lib/cupertino/dialog/cupertino_alert_dialog.0.dart` after adding `barrierColor: CupertinoColors.activeOrange.withValues(alpha: 0.5),`. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --- packages/flutter/lib/src/cupertino/route.dart | 3 +- .../flutter/test/cupertino/dialog_test.dart | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/cupertino/route.dart b/packages/flutter/lib/src/cupertino/route.dart index 60ece8f8798..3b2dee23499 100644 --- a/packages/flutter/lib/src/cupertino/route.dart +++ b/packages/flutter/lib/src/cupertino/route.dart @@ -1410,6 +1410,7 @@ Future showCupertinoDialog({ required BuildContext context, required WidgetBuilder builder, String? barrierLabel, + Color? barrierColor, bool useRootNavigator = true, bool barrierDismissible = false, RouteSettings? routeSettings, @@ -1422,7 +1423,7 @@ Future showCupertinoDialog({ context: context, barrierDismissible: barrierDismissible, barrierLabel: barrierLabel, - barrierColor: CupertinoDynamicColor.resolve(kCupertinoModalBarrierColor, context), + barrierColor: barrierColor, settings: routeSettings, anchorPoint: anchorPoint, requestFocus: requestFocus, diff --git a/packages/flutter/test/cupertino/dialog_test.dart b/packages/flutter/test/cupertino/dialog_test.dart index bc1920e4c69..bbb00ae9343 100644 --- a/packages/flutter/test/cupertino/dialog_test.dart +++ b/packages/flutter/test/cupertino/dialog_test.dart @@ -1737,6 +1737,60 @@ void main() { semantics.dispose(); }); + testWidgets('showCupertinoDialog - custom barrierColor', (WidgetTester tester) async { + await tester.pumpWidget( + CupertinoApp( + home: Builder( + builder: (BuildContext context) { + return Center( + child: Column( + children: [ + CupertinoButton( + child: const Text('Custom BarrierColor'), + onPressed: () { + showCupertinoDialog( + context: context, + barrierColor: Colors.red, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: const Text('Title'), + content: const Text('Content'), + actions: [ + const CupertinoDialogAction(child: Text('Yes')), + CupertinoDialogAction( + child: const Text('No'), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ); + }, + ); + }, + ), + ], + ), + ); + }, + ), + ), + ); + + await tester.tap(find.text('Custom BarrierColor')); + await tester.pumpAndSettle(); + expect(tester.widget(find.byType(ModalBarrier).last).color, equals(Colors.red)); + + await tester.tap(find.text('No')); + await tester.pumpAndSettle(); + expect( + find.byWidgetPredicate( + (Widget widget) => widget is ModalBarrier && widget.color == Colors.red, + ), + findsNothing, + ); + }); + testWidgets('CupertinoDialogRoute is state restorable', (WidgetTester tester) async { await tester.pumpWidget( const CupertinoApp(restorationScopeId: 'app', home: _RestorableDialogTestWidget()),