web-dev-qa-db-fra.com

Comment ouvrir un PopupMenuButton?

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.

12
DogeLion

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.

11
Eric Seidel

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,
)
3
Rainer Wittmann

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.

0
Rainer Wittmann