diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index 9a87de8a00..c89262614e 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -37,6 +37,7 @@ const double _kMenuMinWidth = 2.0 * _kMenuWidthStep; const double _kMenuVerticalPadding = 8.0; const double _kMenuWidthStep = 56.0; const double _kMenuScreenPadding = 8.0; +const double _kDefaultIconSize = 24.0; /// Used to configure how the [PopupMenuButton] positions its popup menu. enum PopupMenuPosition { @@ -1088,7 +1089,9 @@ class PopupMenuButton extends StatefulWidget { /// If provided, the size of the [Icon]. /// - /// If this property is null, the default size is 24.0 pixels. + /// If this property is null, then [IconThemeData.size] is used. + /// If [IconThemeData.size] is also null, then + /// default size is 24.0 pixels. final double? iconSize; /// Optional size constraints for the menu. @@ -1190,6 +1193,7 @@ class PopupMenuButtonState extends State> { @override Widget build(BuildContext context) { + final IconThemeData iconTheme = IconTheme.of(context); final bool enableFeedback = widget.enableFeedback ?? PopupMenuTheme.of(context).enableFeedback ?? true; @@ -1212,7 +1216,7 @@ class PopupMenuButtonState extends State> { icon: widget.icon ?? Icon(Icons.adaptive.more), padding: widget.padding, splashRadius: widget.splashRadius, - iconSize: widget.iconSize ?? 24.0, + iconSize: widget.iconSize ?? iconTheme.size ?? _kDefaultIconSize, tooltip: widget.tooltip ?? MaterialLocalizations.of(context).showMenuTooltip, onPressed: widget.enabled ? showButtonMenu : null, enableFeedback: enableFeedback, diff --git a/packages/flutter/test/material/popup_menu_test.dart b/packages/flutter/test/material/popup_menu_test.dart index 2a960ad489..ab7acafca3 100644 --- a/packages/flutter/test/material/popup_menu_test.dart +++ b/packages/flutter/test/material/popup_menu_test.dart @@ -2698,6 +2698,51 @@ void main() { expect(tester.getTopLeft(find.byWidgetPredicate((Widget w) => '${w.runtimeType}' == '_PopupMenu')), const Offset(8.0, 90.0)); }); + + testWidgets("PopupMenuButton icon inherits IconTheme's size", (WidgetTester tester) async { + Widget _buildPopupMenu({double? themeIconSize, double? iconSize}) { + return MaterialApp( + theme: ThemeData( + iconTheme: IconThemeData( + size: themeIconSize, + ), + ), + home: Scaffold( + body: Center( + child: PopupMenuButton( + iconSize: iconSize, + itemBuilder: (_) => >[ + const PopupMenuItem( + value: 'value', + child: Text('Item 0'), + ), + ], + ), + ), + ), + ); + } + + // Popup menu with default icon size. + await tester.pumpWidget(_buildPopupMenu()); + IconButton iconButton = tester.widget(find.widgetWithIcon(IconButton, Icons.more_vert)); + // Default PopupMenuButton icon size is 24.0. + expect(iconButton.iconSize, 24.0); + + // Popup menu with custom theme icon size. + await tester.pumpWidget(_buildPopupMenu(themeIconSize: 30.0)); + await tester.pumpAndSettle(); + iconButton = tester.widget(find.widgetWithIcon(IconButton, Icons.more_vert)); + // PopupMenuButton icon inherits IconTheme's size. + expect(iconButton.iconSize, 30.0); + + // Popup menu with custom icon size. + await tester.pumpWidget(_buildPopupMenu(themeIconSize: 30.0, iconSize: 50.0)); + await tester.pumpAndSettle(); + iconButton = tester.widget(find.widgetWithIcon(IconButton, Icons.more_vert)); + // PopupMenuButton icon size overrides IconTheme's size. + expect(iconButton.iconSize, 50.0); + }); } class TestApp extends StatefulWidget {