【问题标题】:Snackbar is displayed after tapping back button点按返回按钮后显示 Snackbar
【发布时间】:2019-10-25 13:27:44
【问题描述】:

流程是:用户单击屏幕 1 中的链接以转到屏幕 2。在屏幕 2 上,用户输入所需的数据并点击保存数据的保存按钮,然后导航到屏幕 1,我想在其中显示快餐栏。

这听起来与thisthis 的帖子非常相似,但它不适用于我。所以,我关注了this 代码示例,它可以正常工作,但是有一个问题。

如果我从屏幕 2 按下应用栏后退按钮或设备后退按钮,它仍会在屏幕 1 上显示小吃栏。想知道如何避免点击返回按钮后不显示小吃栏的这种行为。

用户在屏幕 2 上保存数据后,我只是使用 Navigator.pop(context) 将用户带到屏幕 1。在屏幕 1 上,我有一个导航到屏幕 2 并触发小吃栏的方法,如下所示:

Navigator.push(
      context, MaterialPageRoute(builder: (context) => Screen2())
    );
    scaffoldKey.currentState.showSnackBar(SnackBar(content: Text('Show me'),));

虽然这可行,但我不想在用户点击后退按钮时显示小吃栏。

【问题讨论】:

    标签: flutter snackbar


    【解决方案1】:

    问题是,您的snackBar 有持续时间,如果您导航回屏幕,在该持续时间内,您会再次看到那个旧的snackBar。

    解决方法是在 Navigator 之前添加这个方法:

    Scaffold.of(context).removeCurrentSnackBar();
    
    

    在您的情况下,您使用的是scaffoldKey,因此请根据需要进行翻译。但是,请确保您与正确的 Scaffold 联系。

    scaffoldKey.currentState.removeCurrentSnackBar();
    

    官方链接: https://api.flutter.dev/flutter/material/ScaffoldState/removeCurrentSnackBar.html

    编辑:关于在 Screen 2 Scaffold 中调用 Screen 1 Scaffold:

    您的屏幕有支架。如我所见,脚手架在你的情况下有关键。

    假设 Screen1 有 screen1Key ScaffoldState 键。 Screen2 也一样。

    必须在 Screen2 内调用

    screen1Key.currentState.removeCurrentSnackBar();
    
    full example:
    
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MaterialApp(
        home: Screen1(),
      ));
    }
    
    GlobalKey<ScaffoldState> screen1Key = GlobalKey<ScaffoldState>();
    GlobalKey<ScaffoldState> screen2Key = GlobalKey<ScaffoldState>();
    
    class Screen1 extends StatefulWidget {
      @override
      _Screen1State createState() => _Screen1State();
    }
    
    class _Screen1State extends State<Screen1> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          key: screen1Key,
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                RaisedButton(
                  onPressed: () {
                    screen1Key.currentState
                        .showSnackBar(SnackBar(content: Text('Screen 1 SnackBar')));
                  },
                  child: Text('Show SnackBar'),
                ),
                RaisedButton(
                  onPressed: () {
                    Navigator.push(context, MaterialPageRoute(builder: (context) {
                      return Screen2();
                    }));
                  },
                  child: Text('Navigate forward'),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class Screen2 extends StatefulWidget {
      @override
      _Screen2State createState() => _Screen2State();
    }
    
    class _Screen2State extends State<Screen2> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          key: screen2Key,
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                RaisedButton(
                  onPressed: () {
                    screen2Key.currentState
                        .showSnackBar(SnackBar(content: Text('Screen 2 SnackBar')));
                  },
                  child: Text('Show SnackBar'),
                ),
                RaisedButton(
                  onPressed: () {
                    screen1Key.currentState.removeCurrentSnackBar();
                    Navigator.pop(context);
                  },
                  child: Text('Navigate Back'),
                ),
              ],
            ),
          ),
        );
      }
    }
    

    我希望我能很好地理解你的问题。

    【讨论】:

    • 在 Navigator 之前添加了该行,但在点击返回按钮后它仍然向我显示小吃栏。 scaffoldKey.currentState.removeCurrentSnackBar(); Navigator.push( context, MaterialPageRoute(builder: (context) =&gt; Screen2()) ); scaffoldKey.currentState.showSnackBar(SnackBar(content: Text(' Show me'),));
    • 您确定,您调用的是正确的 Scaffold 吗?如果您调用 Screen2 Scaffold,它将无法正常工作。您必须在 Screen2 中调用 Screen1 Scaffold。
    • 你能详细说明如何在 screen2 中调用 screen1 脚手架吗?目前仅在屏幕 1 上使用scaffoldKey
    • 我用一个完整的演示解释了它。我希望它有所帮助。 @DK15
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多