您只需像这样与您的抽屉
项目交互,就可以简单地更改您感兴趣的内容的状态
:
以下是此示例的相关代码:
class TestPage extends StatefulWidget {
@override
_TestPageState createState() => new _TestPageState();
}
class _TestPageState extends State<TestPage> {
String text = "Initial Text";
@override
Widget build(BuildContext context) {
return new Scaffold(
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new Container(child: new DrawerHeader(child: new Container())),
new Container (
child: new Column(
children: <Widget>[
new ListTile(leading: new Icon(Icons.info),
onTap:(){
setState((){
text = "info pressed";
});
}
),
new ListTile(leading: new Icon(Icons.save),
onTap:(){
setState((){
text = "save pressed";
});
}
),
new ListTile(leading: new Icon(Icons.settings),
onTap:(){
setState((){
text = "settings pressed";
});
}
),
]
),
)
],
),
),
appBar: new AppBar(title: new Text("Test Page"),),
body: new Center(child: new Text((text)),
));
}
}
...
class _TestPageState extends State<TestPage> {
String text = "Initial Text";
Widget widgetForBody = SomeWidgetFromClass();
...
...
children: <Widget>[
new Container(child: new DrawerHeader(child: new Container())),
new Container (
child: new Column(
children: <Widget>[
new ListTile(leading: new Icon(Icons.info),
onTap:(){
setState((){
widgetForBody = AnotherWidgetFromClass();
});
}
),
new ListTile(leading: new Icon(Icons.save),
onTap:(){
setState((){
widgetForBody = YetAnotherWidgetFromClass();
});
}
),
...
body: _getDrawerItemWidget(_selectedDrawerIndex));
然后在主类或状态类中这样做:
class HomePageState extends State<HomePage> {
int _selectedDrawerIndex = 0;
_getDrawerItemWidget(int pos) {
switch (pos) {
case 0:
return new MainFragment();
case 1:
return new CardMgmt();
}
}
}
CardMgmt类和switch case中的其他类都有自己的build方法,该方法将返回一个Widget,并将其放置在Scaffold的body中。它们可以在同一个dart文件中,甚至可以在另一个文件中。
但是我还有一个问题:
如果我们不是在drawer items中,而是在另一个类(如CardMgmt)中有一个按钮,并且我们希望它返回一个Widget并更新页面,该怎么办?
onTap
属性中调用Navigator.of(context).pop();
来自动关闭抽屉而不是手动关闭,从而增强此功能。 - Shady AzizaonTap
中使用Navigator.of(context).pop();
即可自动关闭抽屉。 - Shady Aziza