diff --git a/packages/flutter/lib/src/material/dropdown_menu.dart b/packages/flutter/lib/src/material/dropdown_menu.dart index 7292634211..350eb9b6c4 100644 --- a/packages/flutter/lib/src/material/dropdown_menu.dart +++ b/packages/flutter/lib/src/material/dropdown_menu.dart @@ -19,6 +19,7 @@ import 'menu_anchor.dart'; import 'menu_style.dart'; import 'text_field.dart'; import 'theme.dart'; +import 'theme_data.dart'; // Navigation shortcuts to move the selected menu items up or down. @@ -535,10 +536,10 @@ class _DropdownMenuState extends State> { ); return _DropdownMenuBody( - key: _anchorKey, width: widget.width, children: [ TextField( + key: _anchorKey, mouseCursor: effectiveMouseCursor, canRequestFocus: canRequestFocus(), enableInteractiveSelection: canRequestFocus(), @@ -607,7 +608,6 @@ class _ArrowDownIntent extends Intent { class _DropdownMenuBody extends MultiChildRenderObjectWidget { const _DropdownMenuBody({ - super.key, super.children, this.width, }); @@ -826,6 +826,7 @@ class _DropdownMenuDefaultsM3 extends DropdownMenuThemeData { return const MenuStyle( minimumSize: MaterialStatePropertyAll(Size(_kMinimumWidth, 0.0)), maximumSize: MaterialStatePropertyAll(Size.infinite), + visualDensity: VisualDensity.standard, ); } diff --git a/packages/flutter/test/material/dropdown_menu_test.dart b/packages/flutter/test/material/dropdown_menu_test.dart index 83be9e9588..62da023541 100644 --- a/packages/flutter/test/material/dropdown_menu_test.dart +++ b/packages/flutter/test/material/dropdown_menu_test.dart @@ -1058,6 +1058,58 @@ void main() { await gesture.moveTo(tester.getCenter(textFieldFinder)); expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.click); }); + + testWidgets('The menu has the same width as the input field in ListView', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/123631 + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: ListView( + children: [ + DropdownMenu( + dropdownMenuEntries: menuChildren, + ), + ], + ), + ), + )); + + final Rect textInput = tester.getRect(find.byType(TextField)); + + await tester.tap(find.byType(TextField)); + await tester.pumpAndSettle(); + + final Finder findMenu = find.byWidgetPredicate((Widget widget) { + return widget.runtimeType.toString() == '_MenuPanel'; + }); + final Rect menu = tester.getRect(findMenu); + expect(textInput.width, menu.width); + + await tester.pumpWidget(Container()); + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: ListView( + children: [ + DropdownMenu( + width: 200, + dropdownMenuEntries: menuChildren, + ), + ], + ), + ), + )); + + final Rect textInput1 = tester.getRect(find.byType(TextField)); + + await tester.tap(find.byType(TextField)); + await tester.pumpAndSettle(); + + final Finder findMenu1 = find.byWidgetPredicate((Widget widget) { + return widget.runtimeType.toString() == '_MenuPanel'; + }); + final Rect menu1 = tester.getRect(findMenu1); + expect(textInput1.width, 200); + expect(menu1.width, 200); + }); } enum TestMenu {