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

在我点击脚手架抽屉里的一个物品后,我想让它自动隐藏起来。我怎么在扑动中做到这一点?

56001 次浏览

Pop () 将从堆栈中弹出 Drawer路由并使其关闭。

对于最新的 Flutter 版本(在我写这篇文章的时候是0.3.2版本) ,实现发生了一些变化,现在 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() 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();

其实很简单

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

解决方案

  1. GlobalKey _ scripoldKey = new GlobalKey () ;

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

  3. 调用 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