Comment ouvrir un menu contextuel à partir d'un deuxième widget?
final button = new PopupMenuButton(
itemBuilder: (_) => <PopupMenuItem<String>>[
new PopupMenuItem<String>(
child: const Text('Doge'), value: 'Doge'),
new PopupMenuItem<String>(
child: const Text('Lion'), value: 'Lion'),
],
onSelected: _doSomething);
final tile = new ListTile(title: new Text('Doge or lion?'), trailing: button);
Je veux ouvrir le menu de button
en appuyant sur tile
.
Cela fonctionne, mais n'est pas élégant (et a le même problème d'affichage que la solution de Rainer ci-dessus:
class _MyHomePageState extends State<MyHomePage> {
final GlobalKey _menuKey = new GlobalKey();
@override
Widget build(BuildContext context) {
final button = new PopupMenuButton(
key: _menuKey,
itemBuilder: (_) => <PopupMenuItem<String>>[
new PopupMenuItem<String>(
child: const Text('Doge'), value: 'Doge'),
new PopupMenuItem<String>(
child: const Text('Lion'), value: 'Lion'),
],
onSelected: (_) {});
final tile =
new ListTile(title: new Text('Doge or lion?'), trailing: button, onTap: () {
// This is a hack because _PopupMenuButtonState is private.
dynamic state = _menuKey.currentState;
state.showButtonMenu();
});
return new Scaffold(
body: new Center(
child: tile,
),
);
}
}
Je soupçonne que ce que vous demandez réellement est quelque chose comme ce qui est suivi par https://github.com/flutter/flutter/issues/254 ou https://github.com/flutter/flutter/issues/8277 - la capacité d'associer une étiquette à un contrôle et de faire en sorte que l'étiquette soit cliquable - et est une fonctionnalité manquante du framework Flutter.
J'ai trouvé une solution à votre question. Vous pouvez fournir un enfant à PopupMenuButton qui peut être n'importe quel widget, y compris un ListTile (voir le code ci-dessous). Le seul problème est que le PopupMenu s'ouvre sur le côté gauche du ListTile.
final popupMenu = new PopupMenuButton(
child: new ListTile(
title: new Text('Doge or lion?'),
trailing: const Icon(Icons.more_vert),
),
itemBuilder: (_) => <PopupMenuItem<String>>[
new PopupMenuItem<String>(
child: new Text('Doge'), value: 'Doge'),
new PopupMenuItem<String>(
child: new Text('Lion'), value: 'Lion'),
],
onSelected: _doSomething,
)
Je ne pense pas qu'il existe un moyen d'atteindre ce comportement. Bien que vous puissiez attacher un attribut onTap
à la vignette, vous ne pouvez pas accéder au MenuButton depuis "l'extérieur"
Une approche que vous pourriez adopter consiste à utiliser ExpansionPanels car ils ressemblent à des ListTiles et sont destinés à permettre une modification et une édition faciles.