如何在项目点击后关闭脚手架的抽屉?

时间:2017-05-05 14:11:58

标签: dart flutter

在我点击脚手架抽屉中的物品后,我希望它自动隐藏自己。我如何在Flutter中做到这一点?

10 个答案:

答案 0 :(得分:15)

Navigator.pop()会将Drawer路线从堆栈中弹出并使其关闭。

答案 1 :(得分:10)

答案 2 :(得分:7)

首先创建一个ScaffoldState密钥

GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

Scaffold(
  key: _scaffoldKey,)

//现在您可以使用toggleDrawer()方法打开和关闭抽屉。

 toggleDrawer() async {
if (_scaffoldKey.currentState.isDrawerOpen) {
  _scaffoldKey.currentState.openEndDrawer();
} else {
  _scaffoldKey.currentState.openDrawer();
}}

答案 3 :(得分:3)

快捷方式,用于关闭抽屉并导航到新路线:

Navigator.popAndPushNamed(context, '/newroute');

答案 4 :(得分:2)

如果您只想关闭Drawer,则可以使用以下任何一种方法:

Navigator.pop(context);
Navigator.of(context).pop();

如果要导航到新页面,可以使用

Navigator.popAndPushNamed(context, "/new_page");

Navigator.pop(context);
Navigator.push(context, MaterialPageRoute(builder: (_) => Page2()));

答案 5 :(得分:0)

我认为OP可能要说的是,即使Navigator.of(context).pop()和Navigator.pop(context)应该可以工作,但在他的情况下却不行,我有同样的问题。

在项目的早期,抽屉可以正常工作-正确打开和关闭。由于已经进行了几次更改(没有直接更改到抽屉或其支架),所以抽屉不再通过Navigator.of(context).pop()和Navigator.pop(context)关闭。

我做了一些进一步的挖掘,发现可以使用Scaffold.of(context).openEndDrawer来关闭抽屉,而不是使用Navigator.pop来关闭抽屉-即使看起来不应该如此。到目前为止,我从未使用过此功能,但它可以完美运行。希望这对遇到同样问题的人有所帮助。

答案 6 :(得分:0)

这就是答案

一流的

GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

第二个小工具

 Scaffold(key: _scaffoldKey,)

第三个代码

if (_scaffoldKey.currentState.isDrawerOpen) {
  _scaffoldKey.currentState.openEndDrawer();
}

答案 7 :(得分:0)

您可以根据需要使用以下代码。

当你想删除和推送新路由时:

Navigator.of(context).popAndPushNamed('/routeName');

当您只想弹出时:

Navigator.of(context).pop();

答案 8 :(得分:0)

其实很简单

问题说明:在默认主页中,当有人按下后退按钮时,(如果抽屉是打开的)它是关闭的,否则会抛出一个提示,要求退出应用程序“是”和“否”。

解决方案

  1. 添加

    GlobalKey _scaffoldKey = new GlobalKey();

  2. 使函数 Future _onWillPop() 异步处理所需的问题陈述

  3. Call key 和 onWillPop 如下源代码所示

查看完整源代码 源代码中与此问题陈述相关的添加

import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

  Future<bool> _onWillPop() async {
    if(_scaffoldKey.currentState != null && _scaffoldKey.currentState!.isDrawerOpen){
      return true;
    }
    return (await showDialog(
          context: context,
          builder: (context) => new AlertDialog(
            title: new Text('Leaving our App?'),
            content: new Text('Are you sure you want to Exit?'),
            actions: <Widget>[
              TextButton(
                onPressed: () => Navigator.of(context).pop(false),
                child: new Text('No'),
              ),
              TextButton(
                onPressed: () => Navigator.of(context).pop(true),
                child: new Text('Yes'),
              ),
            ],
          ),
        )) ??
        false;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      body: WillPopScope(
        onWillPop: _onWillPop,
        child: Container(
          child: Center(
            child: Text("Welcome My App"),
          ),
        ),
      ),
      drawer: SideDrawer(),
    );
  }
}

答案 9 :(得分:-1)

Navigate.of(context).pop();
Navigate.pop(contex);

必须是 onTap() 函数中的第一个

例如:

 onTap: () {
 Navigator.of(context).pop();//before pushing to any other route 
 Navigator.push(
 context,
 MaterialPageRoute(
 builder: (BuildContext context) => Screen2(),
   ),
  );
 }