Flutter Drawer Widget - 更改Scaffold.body内容

时间:2017-12-23 14:45:39

标签: dart flutter

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

4 个答案:

答案 0 :(得分:13)

您只需通过与state项目进行互动,即可更改您感兴趣内容的Drawer

enter image description here

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

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

答案 1 :(得分:2)

这是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();
                        });
                      }
                  ),
...

答案 2 :(得分:1)

您可以将其用于脚手架:

        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和其他切换类中的类都有其自己的build方法,该方法将返回Widget,并将其放置在脚手架的主体中。它们也可以在同一dart文件中,甚至可以在另一个文件中。
但是我还有另一个问题:
如果在另一个类(如CardMgmt)中有一个按钮而不是抽屉类物品,而我们希望它返回小部件并更新页面,该怎么办?

答案 3 :(得分:1)

这里是使用完整示例进行此操作的简单有效的方法

class _MyPageState extends State<MyPage> {
  Widget bodyWidget;

  Widget drawer() {
    return
  }

  Widget bodyFirst() {
    return Container(
        color: Colors.green, child: Center(child: Text("First Page")));
  }

  Widget bodySecond() {
    return Container(
        color: Colors.limeAccent, child: Center(child: Text("Second Page")));
  }

  Widget bodyThird() {
    return Container(
        color: Colors.lightBlueAccent,
        child: Center(child: Text("Third Page")));
  }
  
  @override
  void initState() {
    super.initState();
    bodyWidget = bodyFirst();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: drawer(),
      appBar: AppBar(title: Text("My App")),
      body: bodyWidget,
    );
  }
}

enter image description here