点击后退按钮后显示小吃栏

时间:2019-06-11 07:13:31

标签: flutter snackbar

流程是:用户单击从屏幕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'),));

尽管可以,但是如果用户单击“后退”按钮,我不想显示小吃栏。

1 个答案:

答案 0 :(得分:0)

问题是,您的快餐栏具有持续时间,如果在该持续时间内,您导航回屏幕,则会再次看到该旧的快餐栏。

解决方案是在导航器之前添加此方法:

Scaffold.of(context).removeCurrentSnackBar();

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

scaffoldKey.currentState.removeCurrentSnackBar();

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

编辑:关于在屏幕2支架内部调用屏幕1支架:

您的屏幕上有脚手架。如我所见,脚手架在您的情况下具有关键作用。

比方说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'),
            ),
          ],
        ),
      ),
    );
  }
}

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