更改 Scaffold.body 值后如何在颤动中隐藏抽屉

jua*_*zac 8 scaffold drawer setstate dart flutter

我正在使用此问题中的方法来更改颤振中 Scaffold 的主体:

Flutter Drawer Widget - 更改 Scaffold.body 内容

所描述的方法非常有效。现在我只想在用户点击其中一个项目后自动关闭抽屉。

我尝试使用 Navigator.pop() 方法,但它会弹出整个屏幕,而不仅仅是抽屉。它让我看到一个全黑的屏幕。

有什么建议?

Fab*_*ese 12

你用的准确Navigator.of(context).pop()吗?我无法重现你的问题,你能发布一个最小的例子来重现它吗?

以下代码按预期工作:设置按钮弹出抽屉,而另一个不弹出。

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  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";
                            });
                            Navigator.of(context).pop();
                          }
                      ),

                    ]
                ),
              )
            ],
          ),
        ),
        appBar: new AppBar(title: new Text("Test Page"),),
        body: new Center(child: new Text((text)),
        ));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 你是对的。事实证明,我将 Scaffold 包装在 MaterialApp 中。这导致了这个问题。谢谢! (4认同)

Blo*_*oss 6

创建脚手架密钥

关闭抽屉

 _scaffoldKey.currentState.openEndDrawer(),
Run Code Online (Sandbox Code Playgroud)

打开抽屉

scaffoldKey.currentState.openDrawer(),
Run Code Online (Sandbox Code Playgroud)

例子

     InkWell(
        onTap: ()=> widget.scaffoldKey.currentState.openDrawer(),
        child: Icon(
          Icons.menu,
          size: 38,
          color: Color(0xFFFFFFFF),
        ),
      ), 
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个可怕的黑客,但我认为它拯救了我的一天。不知何故,我的 ListTiles 与我的脚手架处于不同的上下文中,因此我无法从那里访问导航器来关闭抽屉。首先奇怪的是键上没有 closeDrawer() 方法,我可以将其注入到 ListTile 中。首先打开 EndDrawer 会关闭抽屉。所以只要我没有 EndDrawer 我就可以使用这个方法。 (2认同)