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<void>(
      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>[
              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].

<!-- Links -->
[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
This commit is contained in:
masato 2025-05-01 03:43:49 +09:00 committed by GitHub
parent bc293af1b1
commit b714d8b34c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 56 additions and 1 deletions

View File

@ -1410,6 +1410,7 @@ Future<T?> showCupertinoDialog<T>({
required BuildContext context,
required WidgetBuilder builder,
String? barrierLabel,
Color? barrierColor,
bool useRootNavigator = true,
bool barrierDismissible = false,
RouteSettings? routeSettings,
@ -1422,7 +1423,7 @@ Future<T?> showCupertinoDialog<T>({
context: context,
barrierDismissible: barrierDismissible,
barrierLabel: barrierLabel,
barrierColor: CupertinoDynamicColor.resolve(kCupertinoModalBarrierColor, context),
barrierColor: barrierColor,
settings: routeSettings,
anchorPoint: anchorPoint,
requestFocus: requestFocus,

View File

@ -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: <Widget>[
CupertinoButton(
child: const Text('Custom BarrierColor'),
onPressed: () {
showCupertinoDialog<void>(
context: context,
barrierColor: Colors.red,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: const Text('Title'),
content: const Text('Content'),
actions: <Widget>[
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<ModalBarrier>(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()),