diff --git a/packages/flutter/lib/src/material/menu_anchor.dart b/packages/flutter/lib/src/material/menu_anchor.dart index 3953f9ee833d3d..d0d7f56afa8b9c 100644 --- a/packages/flutter/lib/src/material/menu_anchor.dart +++ b/packages/flutter/lib/src/material/menu_anchor.dart @@ -856,7 +856,7 @@ class MenuItemButton extends StatefulWidget { this.trailingIcon, this.closeOnActivate = true, this.overflowAxis = Axis.horizontal, - required this.child, + this.child, }); /// Called when the button is tapped or otherwise activated. @@ -1141,7 +1141,7 @@ class _MenuItemButtonState extends State { trailingIcon: widget.trailingIcon, hasSubmenu: false, overflowAxis: _anchor?._orientation ?? widget.overflowAxis, - child: widget.child!, + child: widget.child, ), ); @@ -1986,7 +1986,7 @@ class _SubmenuButtonState extends State { trailingIcon: widget.trailingIcon, hasSubmenu: true, showDecoration: (controller._anchor!._parent?._orientation ?? Axis.horizontal) == Axis.vertical, - child: child ?? const SizedBox(), + child: child, ), ), ), @@ -2981,7 +2981,7 @@ class _MenuItemLabel extends StatelessWidget { this.shortcut, this.semanticsLabel, this.overflowAxis = Axis.vertical, - required this.child, + this.child, }); /// Whether or not this menu has a submenu. @@ -3011,8 +3011,8 @@ class _MenuItemLabel extends StatelessWidget { /// The direction in which the menu item expands. final Axis overflowAxis; - /// The required label child widget. - final Widget child; + /// An optional child widget that is displayed in the label. + final Widget? child; @override Widget build(BuildContext context) { @@ -3029,14 +3029,15 @@ class _MenuItemLabel extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ if (leadingIcon != null) leadingIcon!, - Expanded( - child: ClipRect( - child: Padding( - padding: leadingIcon != null ? EdgeInsetsDirectional.only(start: horizontalPadding) : EdgeInsets.zero, - child: child, + if (child != null) + Expanded( + child: ClipRect( + child: Padding( + padding: leadingIcon != null ? EdgeInsetsDirectional.only(start: horizontalPadding) : EdgeInsets.zero, + child: child, + ), ), ), - ), ], ), ), @@ -3046,10 +3047,11 @@ class _MenuItemLabel extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ if (leadingIcon != null) leadingIcon!, - Padding( - padding: leadingIcon != null ? EdgeInsetsDirectional.only(start: horizontalPadding) : EdgeInsets.zero, - child: child, - ), + if (child != null) + Padding( + padding: leadingIcon != null ? EdgeInsetsDirectional.only(start: horizontalPadding) : EdgeInsets.zero, + child: child, + ), ], ); } diff --git a/packages/flutter/test/material/menu_anchor_test.dart b/packages/flutter/test/material/menu_anchor_test.dart index 5ff7ef894265b8..3759ccf1915e1b 100644 --- a/packages/flutter/test/material/menu_anchor_test.dart +++ b/packages/flutter/test/material/menu_anchor_test.dart @@ -2532,6 +2532,22 @@ void main() { ..rect(color: overlayColor.withOpacity(0.1)), ); }); + + testWidgets('MenuItemButton can build when its child is null', (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: Scaffold( + body: SizedBox( + width: 200, + child: MenuItemButton(), + ), + ), + ), + ); + + // exception `Null check operator used on a null value` would be thrown. + expect(tester.takeException(), isNull); + }); }); group('Layout', () {