Como usar DrawerControllerState em uma gaveta?
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
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.