diff --git a/packages/material_ui/lib/src/dialog.dart b/packages/material_ui/lib/src/dialog.dart index 4d68231347d..9c4b4d40d0a 100644 --- a/packages/material_ui/lib/src/dialog.dart +++ b/packages/material_ui/lib/src/dialog.dart @@ -1683,6 +1683,7 @@ Future showDialog({ bool fullscreenDialog = false, bool? requestFocus, AnimationStyle? animationStyle, + RouteBarrierBuilder? barrierBuilder, }) { assert(_debugIsActive(context)); assert(debugCheckHasMaterialLocalizations(context)); @@ -1717,6 +1718,7 @@ Future showDialog({ requestFocus: requestFocus, animationStyle: animationStyle, fullscreenDialog: fullscreenDialog, + barrierBuilder: barrierBuilder, ); }, builder: (BuildContext routeContext) { @@ -1767,6 +1769,7 @@ Future showAdaptiveDialog({ TraversalEdgeBehavior? traversalEdgeBehavior, bool? requestFocus, AnimationStyle? animationStyle, + RouteBarrierBuilder? barrierBuilder, }) { final ThemeData theme = Theme.of(context); switch (theme.platform) { @@ -1787,6 +1790,7 @@ Future showAdaptiveDialog({ traversalEdgeBehavior: traversalEdgeBehavior, requestFocus: requestFocus, animationStyle: animationStyle, + barrierBuilder: barrierBuilder, ); case TargetPlatform.iOS: case TargetPlatform.macOS: @@ -1881,6 +1885,7 @@ class DialogRoute extends RawDialogRoute { super.anchorPoint, super.traversalEdgeBehavior, super.fullscreenDialog, + super.barrierBuilder, AnimationStyle? animationStyle, }) : _animationStyle = animationStyle, super( diff --git a/packages/material_ui/pending_changelogs/change_2026_08_19_1787143102918.yaml b/packages/material_ui/pending_changelogs/change_2026_08_19_1787143102918.yaml new file mode 100644 index 00000000000..56f02c1b4a3 --- /dev/null +++ b/packages/material_ui/pending_changelogs/change_2026_08_19_1787143102918.yaml @@ -0,0 +1,3 @@ +changelog: | + - Add barrierBuilder support to Material dialogs. +version: minor diff --git a/packages/material_ui/test/dialog_test.dart b/packages/material_ui/test/dialog_test.dart index ab59e78b108..ebd8fac0756 100644 --- a/packages/material_ui/test/dialog_test.dart +++ b/packages/material_ui/test/dialog_test.dart @@ -3505,6 +3505,58 @@ void main() { semantics.dispose(); }); + + testWidgets('showDialog applies custom barrierBuilder', (WidgetTester tester) async { + const expectedPadding = 12.0; + const barrierKey = ValueKey('custom-barrier-padding'); + RouteBarrierDetails? capturedDetails; + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (BuildContext context) { + return ElevatedButton( + onPressed: () { + showDialog( + context: context, + barrierLabel: 'barrier_label', + barrierColor: const Color(0xFF00FF00), + barrierBuilder: + (BuildContext context, RouteBarrierDetails details, Widget barrier) { + capturedDetails = details; + return Padding( + key: barrierKey, + padding: const EdgeInsets.all(expectedPadding), + child: barrier, + ); + }, + builder: (BuildContext context) => const Text('Dialog'), + ); + }, + child: const Text('Show Dialog'), + ); + }, + ), + ), + ); + + // Open the dialog. + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + + final Padding paddingWidget = tester.widget(find.byKey(barrierKey)); + expect(paddingWidget.padding, const EdgeInsets.all(expectedPadding)); + + final ModalBarrier barrierWidget = tester.widget( + find.descendant(of: find.byKey(barrierKey), matching: find.byType(ModalBarrier)), + ); + expect(barrierWidget.color, const Color(0xFF00FF00)); + + expect(capturedDetails, isNotNull); + expect(capturedDetails!.barrierColor, const Color(0xFF00FF00)); + expect(capturedDetails!.barrierDismissible, true); + expect(capturedDetails!.barrierLabel, 'barrier_label'); + }); } @pragma('vm:entry-point')