Fix DropdownMenu with expandedInsets always aligned on top (#156214)

Fixes [DropdownMenu can not be center aligned when using expandedInsets
](https://github.com/flutter/flutter/issues/155581)

### Code sample

<details>
<summary>expand to view the code sample</summary> 

```dart
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    final List<DropdownMenuEntry<ShortMenu>> shortMenuItems =
        <DropdownMenuEntry<ShortMenu>>[];
    for (final ShortMenu value in ShortMenu.values) {
      final DropdownMenuEntry<ShortMenu> entry =
          DropdownMenuEntry<ShortMenu>(value: value, label: value.label);
      shortMenuItems.add(entry);
    }

    return MaterialApp(
      home: Scaffold(
        body: Row(
          children: <Widget>[
            Expanded(
              child: Center(
                child: DropdownMenu<ShortMenu>(
                  expandedInsets: const EdgeInsets.all(16),
                  initialSelection: ShortMenu.item0,
                  dropdownMenuEntries: shortMenuItems,
                  label: const Text('With expandedInsets'),
                ),
              ),
            ),
            Expanded(
              child: Center(
                child: DropdownMenu<ShortMenu>(
                  initialSelection: ShortMenu.item0,
                  dropdownMenuEntries: shortMenuItems,
                  label: const Text('Without expandedInsets'),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

enum ShortMenu {
  item0('Menu 0'),
  item1('Menu 1'),
  item2('Menu 2');

  const ShortMenu(this.label);
  final String label;
}
```

</details>

### Before 
(`DropdownMenu` without `expandedInsets` cannot be centered)
<img width="770" alt="Screenshot 2024-10-04 at 14 13 58" src="https://github.com/user-attachments/assets/c7520c12-d16a-4867-8fae-38b75dbc4225">

### After
(`DropdownMenu` with `expandedInsets` be centered)

<img width="770" alt="Screenshot 2024-10-04 at 14 13 49" src="https://github.com/user-attachments/assets/82e0b81e-5c85-4e59-99b8-df329459773b">
This commit is contained in:
Taha Tesser 2024-10-07 16:43:22 +03:00 committed by GitHub
parent ef4807b4cd
commit b3de00ad54
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 38 additions and 4 deletions

View File

@ -972,10 +972,7 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
),
),
),
child: Align(
alignment: AlignmentDirectional.topStart,
child: menuAnchor,
),
child: menuAnchor,
);
}

View File

@ -3415,6 +3415,43 @@ void main() {
tester.getRect(find.byType(TextField).first).bottom,
);
});
testWidgets('DropdownMenu with expandedInsets can be aligned', (WidgetTester tester) async {
Widget buildMenuAnchor({ AlignmentGeometry alignment = Alignment.topCenter }) {
return MaterialApp(
home: Scaffold(
body: Row(
children: <Widget>[
Expanded(
child: Align(
alignment: alignment,
child: DropdownMenu<TestMenu>(
expandedInsets: const EdgeInsets.all(16),
dropdownMenuEntries: menuChildren,
),
),
),
],
),
),
);
}
await tester.pumpWidget(buildMenuAnchor());
Offset textFieldPosition = tester.getTopLeft(find.byType(TextField));
expect(textFieldPosition, equals(const Offset(16.0, 0.0)));
await tester.pumpWidget(buildMenuAnchor(alignment: Alignment.center));
textFieldPosition = tester.getTopLeft(find.byType(TextField));
expect(textFieldPosition, equals(const Offset(16.0, 272.0)));
await tester.pumpWidget(buildMenuAnchor(alignment: Alignment.bottomCenter));
textFieldPosition = tester.getTopLeft(find.byType(TextField));
expect(textFieldPosition, equals(const Offset(16.0, 544.0)));
});
}
enum TestMenu {