在我点击脚手架抽屉中的物品后,我希望它自动隐藏自己。我如何在Flutter中做到这一点?
答案 0 :(得分:15)
Navigator.pop()会将Drawer
路线从堆栈中弹出并使其关闭。
答案 1 :(得分:10)
Navigator.of(context).pop()
应该做你想做的事情:)
https://docs.flutter.io/flutter/widgets/Navigator-class.html https://docs.flutter.io/flutter/material/Drawer-class.html
答案 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)
其实很简单
问题说明:在默认主页中,当有人按下后退按钮时,(如果抽屉是打开的)它是关闭的,否则会抛出一个提示,要求退出应用程序“是”和“否”。
解决方案
添加
GlobalKey _scaffoldKey = new GlobalKey();
使函数 Future _onWillPop() 异步处理所需的问题陈述
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(),
),
);
}