Unverified Commit 08c83591 authored by creativecreatorormaybenot's avatar creativecreatorormaybenot Committed by GitHub

Expose showButtonMenu of PopupMenuButtonState (#50670)

parent 63ca3348
......@@ -1037,10 +1037,22 @@ class PopupMenuButton<T> extends StatefulWidget {
final bool captureInheritedThemes;
@override
_PopupMenuButtonState<T> createState() => _PopupMenuButtonState<T>();
PopupMenuButtonState<T> createState() => PopupMenuButtonState<T>();
}
class _PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
/// The [State] for a [PopupMenuButton].
///
/// See [showButtonMenu] for a way to programmatically open the popup menu
/// of your button state.
class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
/// A method to show a popup menu with the items supplied to
/// [PopupMenuButton.itemBuilder] at the position of your [PopupMenuButton].
///
/// By default, it is called when the user taps the button and [PopupMenuButton.enabled]
/// is set to `true`. Moreover, you can open the button by calling the method manually.
///
/// You would access your [PopupMenuButtonState] using a [GlobalKey] and
/// show the menu of the button with `globalKey.currentState.showButtonMenu`.
void showButtonMenu() {
final PopupMenuThemeData popupMenuTheme = PopupMenuTheme.of(context);
final RenderBox button = context.findRenderObject() as RenderBox;
......
......@@ -1197,6 +1197,41 @@ void main() {
expect(rootObserver.menuCount, 1);
expect(nestedObserver.menuCount, 0);
});
testWidgets('PopupMenuButton calling showButtonMenu manually', (WidgetTester tester) async {
final GlobalKey<PopupMenuButtonState<int>> globalKey = GlobalKey();
await tester.pumpWidget(
MaterialApp(
home: Material(
child: Column(
children: <Widget>[
PopupMenuButton<int>(
key: globalKey,
itemBuilder: (BuildContext context) {
return <PopupMenuEntry<int>>[
const PopupMenuItem<int>(
value: 1,
child: Text('Tap me please!'),
),
];
},
),
],
),
),
)
);
expect(find.text('Tap me please!'), findsNothing);
globalKey.currentState.showButtonMenu();
// The PopupMenuItem will appear after an animation, hence,
// we have to first wait for the tester to settle.
await tester.pumpAndSettle();
expect(find.text('Tap me please!'), findsOneWidget);
});
}
class TestApp extends StatefulWidget {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment