流程是:用户单击从屏幕1到屏幕2的链接。在屏幕2上,用户输入所需的数据,然后单击保存数据的保存按钮,然后导航到要显示小吃栏的屏幕1。
这听起来与this和this的帖子非常相似,但不适用于我。因此,我遵循了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'),));
尽管可以,但是如果用户单击“后退”按钮,我不想显示小吃栏。
答案 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'),
),
],
),
),
);
}
}
希望我能很好地理解您的问题。