【问题标题】:Close side drawer when user comes back to home screen (Flutter)当用户返回主屏幕时关闭侧边抽屉(颤振)
【发布时间】:2021-05-24 13:09:59
【问题描述】:

在我创建的侧抽屉中,当用户点击任何链接时,用户转到该屏幕并且抽屉也关闭,这没有问题,同样当用户打开侧抽屉并按返回键时,抽屉关闭,这也是工作。

但是,假设用户点击了“我的个人资料”链接(或任何链接),然后如果用户从个人资料屏幕按返回键返回主屏幕(或在应用栏中使用返回键),用户会找到侧边抽屉在主屏幕上打开。然后任何一个用户都必须按返回键或点击屏幕上的任意位置来关闭抽屉。

最初,我的抽屉甚至没有在后按时关闭,我找到了这篇文章 [https://stackoverflow.com/q/60314156] 并实施了 WillPopScope() [实际上这对我有帮助to close drawer on backpress],但是我已经解释过的问题仍然没有通过 WillPopScope 解决。

请让我知道我必须做哪些更改才能实现此行为。

这就是我创建文件的方式: HomePage 具有 BottomNavigationDrawer,用户通过它进入购物页面(实际上标记为“主页”),这是用户看到侧抽屉的页面。因此,在上面解释我所说的主页时,我指的是用户导航到个人资料页面的购物页面。

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(

【问题讨论】:

  • 你能分享你推到另一个屏幕的抽屉代码吗?

标签: flutter onbackpressed


【解决方案1】:

你只需调用:-

Navigator.pop(context);

在从抽屉导航到另一个屏幕之前。就像当用户点击你的个人资料然后在 onTap 方法中首先弹出它然后导航。

onTap:(){
Navigator.pop(context);
//then write navigation statement over here
}

【讨论】:

    【解决方案2】:

    发生这种情况是因为导航抽屉仍在页面堆栈中。 当用户使用链接导航到另一个屏幕时,它会将新屏幕添加到堆栈中。

    你的尝试:

    WillPopScope(
          onWillPop: () async {
            if (_key.currentState.isDrawerOpen) {
              Navigator.of(context).pop();
              return false;
            }
    

    当用户在购物屏幕上按下返回按钮时,如果导航抽屉打开,则关闭它。

    在导航到下一个屏幕之前,您需要从堆栈中删除导航抽屉。你可以通过添加来做到这一点

    Navigator.pop(context);
    

    在导航逻辑之前。

    你也可以试试

    Navigator.pushReplacement(context, <newRoute>)
    

    用新屏幕替换导航抽屉,结果也一样。

    【讨论】:

    • 感谢您为解释堆栈如何工作的基本概念以及为什么我们需要在这里使用 pop 的方式所做的努力,但是作为初学者,我在中途回答时几乎没有迷失和困惑。跨度>
    【解决方案3】:

    试试这个

    GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
    
    Scaffold(
      key: _scaffoldKey,
      )
    // now you can open and close the drawer using the above key
    
    
    if (_scaffoldKey.currentState.isDrawerOpen) {
      _scaffoldKey.currentState.openEndDrawer();
    } else {
      _scaffoldKey.currentState.openDrawer();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 2021-07-16
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多