Flutter Drawer Widget - 更改Scaffold.body内容

Mar*_*tin 5 dart flutter

使用Flutter Scaffold.Drawer时 - 是否可以让抽屉中的链接更改页面上的内容(Scaffold.body)?与导航抽屉中的链接类似,在Android中更改片段.

azi*_*iza 14

您可以通过state与以下内容进行互动来更改您感兴趣的内容Drawer:

在此输入图像描述

以下是此示例的相关代码:

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)),
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望通过在`onTap`属性中调用`Navigator.of(context).pop();`来自动关闭抽屉,而不是手动关闭抽屉. (3认同)

bri*_*t08 7

这是 Aziza 的一个非常好的解决方案!谢谢你。有用!我只想补充一点,通过将其替换为小部件状态,它也可以适用于整个身体:

...
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();
                        });
                      }
                  ),
...
Run Code Online (Sandbox Code Playgroud)