Skip to content

Commit

Permalink
fix MenuItemButton if child is null (#147485)
Browse files Browse the repository at this point in the history
Fix #147479

Pre-launch Checklist
  • Loading branch information
zeqinjie committed May 7, 2024
1 parent 8a7c18c commit 23ae246
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 16 deletions.
34 changes: 18 additions & 16 deletions packages/flutter/lib/src/material/menu_anchor.dart
Expand Up @@ -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.
Expand Down Expand Up @@ -1141,7 +1141,7 @@ class _MenuItemButtonState extends State<MenuItemButton> {
trailingIcon: widget.trailingIcon,
hasSubmenu: false,
overflowAxis: _anchor?._orientation ?? widget.overflowAxis,
child: widget.child!,
child: widget.child,
),
);

Expand Down Expand Up @@ -1986,7 +1986,7 @@ class _SubmenuButtonState extends State<SubmenuButton> {
trailingIcon: widget.trailingIcon,
hasSubmenu: true,
showDecoration: (controller._anchor!._parent?._orientation ?? Axis.horizontal) == Axis.vertical,
child: child ?? const SizedBox(),
child: child,
),
),
),
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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) {
Expand All @@ -3029,14 +3029,15 @@ class _MenuItemLabel extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: <Widget>[
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,
),
),
),
),
],
),
),
Expand All @@ -3046,10 +3047,11 @@ class _MenuItemLabel extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: <Widget>[
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,
),
],
);
}
Expand Down
16 changes: 16 additions & 0 deletions packages/flutter/test/material/menu_anchor_test.dart
Expand Up @@ -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', () {
Expand Down

0 comments on commit 23ae246

Please sign in to comment.