Fix for issue 140372 (#144947)

*Continuing work from the PR https://github.com/flutter/flutter/pull/140373*

Add the ability to set route settings on PopupMenuButton

Fixes https://github.com/flutter/flutter/issues/140372

Added UTs as requested
This commit is contained in:
sanni prasad 2024-03-19 03:05:37 +05:30 committed by GitHub
parent 98369bdd50
commit 993f554e4c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 0 deletions

View file

@ -1150,6 +1150,7 @@ class PopupMenuButton<T> extends StatefulWidget {
this.clipBehavior = Clip.none,
this.useRootNavigator = false,
this.popUpAnimationStyle,
this.routeSettings,
this.style,
}) : assert(
!(child != null && icon != null),
@ -1345,6 +1346,11 @@ class PopupMenuButton<T> extends StatefulWidget {
/// If this is null, then the default animation will be used.
final AnimationStyle? popUpAnimationStyle;
/// Optional route settings for the menu.
///
/// See [RouteSettings] for details.
final RouteSettings? routeSettings;
/// Customizes this icon button's appearance.
///
/// The [style] is only used for Material 3 [IconButton]s. If [ThemeData.useMaterial3]
@ -1412,6 +1418,7 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
clipBehavior: widget.clipBehavior,
useRootNavigator: widget.useRootNavigator,
popUpAnimationStyle: widget.popUpAnimationStyle,
routeSettings: widget.routeSettings,
)
.then<void>((T? newValue) {
if (!mounted) {

View file

@ -926,6 +926,39 @@ void main() {
expect(tester.getTopLeft(popupFinder), buttonTopLeft);
});
testWidgets('Popup menu with RouteSettings', (WidgetTester tester) async {
final Key buttonKey = UniqueKey();
const RouteSettings popupRoute = RouteSettings(name: '/popup');
late RouteSettings currentRouteSetting;
await tester.pumpWidget(
MaterialApp(
navigatorObservers: <NavigatorObserver>[
_ClosureNavigatorObserver(onDidChange: (Route<dynamic> newRoute) {
currentRouteSetting = newRoute.settings;
}),
],
home: Scaffold(
body: PopupMenuButton<int>(
key: buttonKey,
routeSettings: popupRoute,
itemBuilder: (_) => <PopupMenuItem<int>>[
const PopupMenuItem<int>(value: 1, child: Text('Item 1')),
const PopupMenuItem<int>(value: 2, child: Text('Item 2')),
],
child: const Text('Show Menu'),
),
),
),
);
final Finder buttonFinder = find.byKey(buttonKey);
await tester.tap(buttonFinder);
await tester.pumpAndSettle();
expect(currentRouteSetting, popupRoute);
});
testWidgets('PopupMenu positioning around display features', (WidgetTester tester) async {
final Key buttonKey = UniqueKey();