在我点击脚手架抽屉里的一个物品后,我想让它自动隐藏起来。我怎么在扑动中做到这一点?
Pop () 将从堆栈中弹出 Drawer路由并使其关闭。
Drawer
Navigator.of(context).pop()应该做你想做的:)
Navigator.of(context).pop()
Https://docs.flutter.io/flutter/widgets/navigator-class.html Https://docs.flutter.io/flutter/material/drawer-class.html
对于最新的 Flutter 版本(在我写这篇文章的时候是0.3.2版本) ,实现发生了一些变化,现在 Navigator.pop()需要一个给定的上下文。
Navigator.pop()
Pop (context) 是关闭路由的典型用法。 Pop (context,没错) 是使用返回的结果关闭路由的用法。
参见《扑动的食谱》中的 抽屉类和 例子。
关闭抽屉并导航到新路线的简称:
Navigator.popAndPushNamed(context, '/newroute');
如果只想关闭 Drawer,可以使用以下任何一种方法:
Navigator.pop(context); Navigator.of(context).pop();
如果要导航到新页面,可以使用
Navigator.popAndPushNamed(context, "/new_page");
或者
Navigator.pop(context); Navigator.push(context, MaterialPageRoute(builder: (_) => Page2()));
我认为 OP 可能想说的是,即使 Navigator.of (上下文)。Pop ()和 Navigator.pop (上下文)应该可以工作,它们不在他的案例中——我遇到了同样的问题。
在一个项目的早期,抽屉的工作原理应该是——正确地打开和关闭。由于已经进行了一些更改(没有直接对抽屉或其脚手架进行更改) ,抽屉不再使用 Navigator.of (上下文)关闭。Pop ()和 Navigator.pop (上下文)。
我做了一些深入的研究,发现可以不使用 Navigator.pop 而使用 Saffold.of (context)。OpenEndDrawer 关闭抽屉——即使它看起来不像是应该关闭的。我从来没有使用这个函数,直到现在,但它完全可以工作。希望这对有同样问题的人有所帮助。
首先创建一个 SaffoldState 密钥
GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); Scaffold( key: _scaffoldKey,)
现在可以使用 toggleDrawer()方法打开和关闭抽屉。
toggleDrawer()
放在左边的抽屉里
toggleDrawer() async { if (_scaffoldKey.currentState.isDrawerOpen) { _scaffoldKey.currentState.openEndDrawer(); } else { _scaffoldKey.currentState.openDrawer(); } }
找到合适的抽屉
toggleDrawer() async { if (_scaffoldKey.currentState.isDrawerOpen) { _scaffoldKey.currentState.openDrawer(); } else { _scaffoldKey.currentState.openEndDrawer(); } }
这就是答案
班上第一名
GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
Widget 第二名
Scaffold(key: _scaffoldKey,)
密码第三
if (_scaffoldKey.currentState.isDrawerOpen) { _scaffoldKey.currentState.openEndDrawer(); }
(上下文) . pop () ; 或者 Pop (contex) ;
必须是 onTap ()函数中的第一个
例如:
onTap: () { Navigator.of(context).pop();//before pushing to any other route Navigator.push( context, MaterialPageRoute( builder: (BuildContext context) => Screen2(), ), ); }
您可以根据需要使用下面的代码。
当你想移除和推送新路线时:
Navigator.of(context).popAndPushNamed('/routeName');
当你想跳的时候:
Navigator.of(context).pop();
其实很简单
问题陈述 : 在默认主页中,当有人按下返回按钮时(如果抽屉是打开的) ,它是关闭的,否则会抛出一个提示,要求退出应用程序“是”和“否”。
解决方案
GlobalKey _ scripoldKey = new GlobalKey () ;
使函数 Future _ onWillPop ()异步处理所需的问题陈述
调用 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(), ); } }
ListTile( title: Text( 'Notification Setting', style: TextStyle( fontSize: 16.0, color: HexColor(HexColor.gray_text)), ), leading: Icon( Icons.notifications_outlined, size: 24.0, color: HexColor(HexColor.primarycolor), ), onTap: () { _scaffoldKey.currentState?.openEndDrawer(); Navigator.push(context, MaterialPageRoute(builder: (context) { return NotificationSettingActivity(); } )); }, ),
首先弹出窗口小部件,然后推你的路线,它会自动关闭抽屉时,你回来的下一次。
Navigator.pop(context); // Widget will be poped Navigator.pushNamed(context, '/routename'); // New Route will be pushed