Fix menu width issue for DropdownMenu
(#123823)
This commit is contained in:
parent
e6c2abb084
commit
db5434e566
@ -19,6 +19,7 @@ import 'menu_anchor.dart';
|
|||||||
import 'menu_style.dart';
|
import 'menu_style.dart';
|
||||||
import 'text_field.dart';
|
import 'text_field.dart';
|
||||||
import 'theme.dart';
|
import 'theme.dart';
|
||||||
|
import 'theme_data.dart';
|
||||||
|
|
||||||
|
|
||||||
// Navigation shortcuts to move the selected menu items up or down.
|
// Navigation shortcuts to move the selected menu items up or down.
|
||||||
@ -535,10 +536,10 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return _DropdownMenuBody(
|
return _DropdownMenuBody(
|
||||||
key: _anchorKey,
|
|
||||||
width: widget.width,
|
width: widget.width,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
TextField(
|
TextField(
|
||||||
|
key: _anchorKey,
|
||||||
mouseCursor: effectiveMouseCursor,
|
mouseCursor: effectiveMouseCursor,
|
||||||
canRequestFocus: canRequestFocus(),
|
canRequestFocus: canRequestFocus(),
|
||||||
enableInteractiveSelection: canRequestFocus(),
|
enableInteractiveSelection: canRequestFocus(),
|
||||||
@ -607,7 +608,6 @@ class _ArrowDownIntent extends Intent {
|
|||||||
|
|
||||||
class _DropdownMenuBody extends MultiChildRenderObjectWidget {
|
class _DropdownMenuBody extends MultiChildRenderObjectWidget {
|
||||||
const _DropdownMenuBody({
|
const _DropdownMenuBody({
|
||||||
super.key,
|
|
||||||
super.children,
|
super.children,
|
||||||
this.width,
|
this.width,
|
||||||
});
|
});
|
||||||
@ -826,6 +826,7 @@ class _DropdownMenuDefaultsM3 extends DropdownMenuThemeData {
|
|||||||
return const MenuStyle(
|
return const MenuStyle(
|
||||||
minimumSize: MaterialStatePropertyAll<Size>(Size(_kMinimumWidth, 0.0)),
|
minimumSize: MaterialStatePropertyAll<Size>(Size(_kMinimumWidth, 0.0)),
|
||||||
maximumSize: MaterialStatePropertyAll<Size>(Size.infinite),
|
maximumSize: MaterialStatePropertyAll<Size>(Size.infinite),
|
||||||
|
visualDensity: VisualDensity.standard,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1058,6 +1058,58 @@ void main() {
|
|||||||
await gesture.moveTo(tester.getCenter(textFieldFinder));
|
await gesture.moveTo(tester.getCenter(textFieldFinder));
|
||||||
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.click);
|
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: <Widget>[
|
||||||
|
DropdownMenu<TestMenu>(
|
||||||
|
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: <Widget>[
|
||||||
|
DropdownMenu<TestMenu>(
|
||||||
|
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 {
|
enum TestMenu {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user