Como usar DrawerControllerState em uma gaveta?

Sep 14 2020

Código mínimo:

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'),
      ),
    );
  }
}

Quando eu pressiono o botão, ele imprime null, então qual é a maneira correta de usar o DrawerControllerState?

Respostas

Alok Sep 14 2020 at 12:34

Veja, o problema é que você não está usando o seu keycorretamente. Em primeiro lugar, para obter o estado de Drawer, você precisa ScaffoldStatenão ter a DrawerControllerStatechave de tipo.

Com o uso de ScaffoldState.currentState, você obterá os dados. Além disso, se você quiser ver se sua gaveta está aberta ou fechada. Você pode usá-lo assim:

ScaffoldState.currentState.isDrawerOpen

Existem duas maneiras de fazer isso:

1. Declarando a GlobalKey globalmente para acessá-la em qualquer lugar

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. Faça sua gaveta dentro da sua MainPage apenas. Facilmente acessível

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
    );
  }
}

Passar GlobalKeyde MainPagepara MyDrawernão ajudará. Você pode brincar com isso.