Comment utiliser DrawerControllerState dans un tiroir?

Sep 14 2020

Code minimal:

void main() => runApp(MaterialApp(home: MainPage()));

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      drawer: MyDrawer(),
    );
  }
}

class MyDrawer extends StatelessWidget {
  final _drawerKey = GlobalKey<DrawerControllerState>();

  @override
  Widget build(BuildContext context) {
    return Drawer(
      key: _drawerKey,
      child: RaisedButton(
        onPressed: () => print(_drawerKey.currentState), // Prints null
        child: Text('Show Dialog'),
      ),
    );
  }
}

Lorsque j'appuie sur le bouton, il s'imprime null, alors quelle est la bonne façon d'utiliser le DrawerControllerState?

Réponses

Alok Sep 14 2020 at 12:34

Vous voyez, le problème est que vous n'utilisez pas keycorrectement votre . Tout d'abord, pour obtenir l'état de Drawer, vous devez ne ScaffoldStatepas avoir la DrawerControllerStateclé de type.

Avec l'utilisation de ScaffoldState.currentState, vous obtiendrez les données. Aussi, si vous voulez voir si votre tiroir est ouvert ou fermé. Vous pouvez l'utiliser comme ceci:

ScaffoldState.currentState.isDrawerOpen

Il y a deux façons de faire ça:

1. Déclarer GlobalKey globalement pour y accéder n'importe où

void main() => runApp(MaterialApp(home: MainPage()));

// declare it globally or make your drawer inside the MainPage only
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

class MainPage extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey, // <-- Use your key here not for drawer
      appBar: AppBar(),
      drawer: MyDrawer(),
    );
  }
}

class MyDrawer extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: RaisedButton(
        onPressed: () => print(_scaffoldKey.currentState.isDrawerOpen), // <-- prints true, when open
        child: Text('Show Dialog'),
      )
    );
  }
}

2. Créez votre tiroir uniquement dans votre MainPage. Facile d'accès

class MainPage extends StatelessWidget {
  
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  
  Drawer get _drawer => Drawer(
    child: RaisedButton(
      onPressed: () => print(_scaffoldKey.currentState.isDrawerOpen), // <-- prints true when opened
      child: Text('Show Dialog'),
    )
  );
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey, // <-- Using Key for Scaffold
      appBar: AppBar(),
      drawer: _drawer
    );
  }
}

Passer le GlobalKeyde MainPageà MyDrawern'aidera pas. Vous pouvez jouer avec ça.