当用户返回主屏幕时关闭侧边抽屉 (Flutter)
Close side drawer when user comes back to home screen (Flutter)
在我创建的侧抽屉中,当用户点击任何 link 时,用户会转到该屏幕并且抽屉也会关闭,这没有问题,当用户打开侧抽屉并按返回键时,抽屉关闭,这也有效。
但是,假设用户单击 'My Profile' link(或任何 link),然后用户从个人资料屏幕按返回键返回主屏幕(或使用应用栏中的后退键),用户发现侧边抽屉在主屏幕上打开。然后用户必须按返回键或点击屏幕上的任意位置才能关闭抽屉。
最初,我的抽屉甚至没有关闭后压,我发现了这个 post [ 并实现了 WillPopScope() [实际上这帮助我关闭了背压抽屉],但是我已经解释过的问题仍然没有用 WillPopScope 解决。
请告诉我我必须做哪些更改才能实现此行为。
这就是我创建文件的方式:主页有 BottomNavigationDrawer,用户通过它进入购物页面(实际上标记为 'Home'),这是用户看到侧边抽屉的页面。因此,在上面解释我所说的主页时,我指的是用户导航到个人资料页面的购物页面。
class ShoppingPage extends StatefulWidget {
@override
_ShoppingPageState createState() => _ShoppingPageState();
}
class _ShoppingPageState extends State<ShoppingPage> {
GlobalKey<ScaffoldState> _key = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
ThemeData getTheme = Theme.of(context);
return WillPopScope(
onWillPop: () async {
if (_key.currentState.isDrawerOpen) {
Navigator.of(context).pop();
return false;
}
return true;
},
child: Scaffold(
key: _key,
appBar: AppBar(
title: ,
elevation: 0,
),
drawer: CustomDrawer(),
body: SafeArea(
child: Container(
您只需调用 :-
Navigator.pop(context);
在从抽屉导航到另一个屏幕之前。就像当用户点击您的个人资料然后在 onTap 方法中首先弹出它然后导航。
onTap:(){
Navigator.pop(context);
//then write navigation statement over here
}
发生这种情况是因为导航抽屉仍在页面堆栈中。
当用户使用 link 导航到另一个屏幕时,它会将新屏幕添加到堆栈中。
你的尝试:
WillPopScope(
onWillPop: () async {
if (_key.currentState.isDrawerOpen) {
Navigator.of(context).pop();
return false;
}
当用户在购物屏幕上按下后退按钮时关闭导航抽屉(如果它打开)。
在导航到下一个屏幕之前,您需要从堆栈中移除导航抽屉。您可以通过添加
Navigator.pop(context);
在导航逻辑之前。
你也可以试试
Navigator.pushReplacement(context, <newRoute>)
用新屏幕替换 Navigation Drawer,这也会产生相同的结果。
在我创建的侧抽屉中,当用户点击任何 link 时,用户会转到该屏幕并且抽屉也会关闭,这没有问题,当用户打开侧抽屉并按返回键时,抽屉关闭,这也有效。
但是,假设用户单击 'My Profile' link(或任何 link),然后用户从个人资料屏幕按返回键返回主屏幕(或使用应用栏中的后退键),用户发现侧边抽屉在主屏幕上打开。然后用户必须按返回键或点击屏幕上的任意位置才能关闭抽屉。
最初,我的抽屉甚至没有关闭后压,我发现了这个 post [
请告诉我我必须做哪些更改才能实现此行为。
这就是我创建文件的方式:主页有 BottomNavigationDrawer,用户通过它进入购物页面(实际上标记为 'Home'),这是用户看到侧边抽屉的页面。因此,在上面解释我所说的主页时,我指的是用户导航到个人资料页面的购物页面。
class ShoppingPage extends StatefulWidget {
@override
_ShoppingPageState createState() => _ShoppingPageState();
}
class _ShoppingPageState extends State<ShoppingPage> {
GlobalKey<ScaffoldState> _key = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
ThemeData getTheme = Theme.of(context);
return WillPopScope(
onWillPop: () async {
if (_key.currentState.isDrawerOpen) {
Navigator.of(context).pop();
return false;
}
return true;
},
child: Scaffold(
key: _key,
appBar: AppBar(
title: ,
elevation: 0,
),
drawer: CustomDrawer(),
body: SafeArea(
child: Container(
您只需调用 :-
Navigator.pop(context);
在从抽屉导航到另一个屏幕之前。就像当用户点击您的个人资料然后在 onTap 方法中首先弹出它然后导航。
onTap:(){
Navigator.pop(context);
//then write navigation statement over here
}
发生这种情况是因为导航抽屉仍在页面堆栈中。 当用户使用 link 导航到另一个屏幕时,它会将新屏幕添加到堆栈中。
你的尝试:
WillPopScope(
onWillPop: () async {
if (_key.currentState.isDrawerOpen) {
Navigator.of(context).pop();
return false;
}
当用户在购物屏幕上按下后退按钮时关闭导航抽屉(如果它打开)。
在导航到下一个屏幕之前,您需要从堆栈中移除导航抽屉。您可以通过添加
Navigator.pop(context);
在导航逻辑之前。
你也可以试试
Navigator.pushReplacement(context, <newRoute>)
用新屏幕替换 Navigation Drawer,这也会产生相同的结果。