Flutter 在“颤振”中导航后显示蛇形条

Flutter 在“颤振”中导航后显示蛇形条,flutter,dart,Flutter,Dart,在执行一个操作(例如“保存”)后,用户将返回到应用程序中的另一个页面 我想在新页面上显示一个snackbar来确认操作,但不想显示用户是否在没有操作的情况下导航到那里。例如,如果用户保存“东西”,应用程序会将它们发送到“东西”主页并显示“保存的”snackbar,但如果用户以其他方式转到“东西”主页,我不希望“保存的”snackbar出现在那里 下面是我保存的面板上的代码,但目标页面不显示snackbar-无论我将snackbar放置在何处(导航之前或之后),它都不会执行snackbar Fut

在执行一个操作(例如“保存”)后,用户将返回到应用程序中的另一个页面

我想在新页面上显示一个snackbar来确认操作,但不想显示用户是否在没有操作的情况下导航到那里。例如,如果用户保存“东西”,应用程序会将它们发送到“东西”主页并显示“保存的”snackbar,但如果用户以其他方式转到“东西”主页,我不希望“保存的”snackbar出现在那里

下面是我保存的面板上的代码,但目标页面不显示snackbar-无论我将snackbar放置在何处(导航之前或之后),它都不会执行snackbar

Future<Null> saveThatThing() async {
  thing.save();
  thing = new Thing();
  Navigator.of(context).push(getSavedThingRoute());
  Scaffold.of(context).showSnackBar(
    new SnackBar(
      content: new Text('You saved the thing!'),
    ),
  );
}
Future saveThatThing()异步{
save();
事物=新事物();
Navigator.of(context.push)(getSavedThingRoute());
Scaffold.of(上下文).showSnackBar(
新小吃吧(
内容:新文本(“你保存了东西!”),
),
);
}

执行此操作的最佳方法是什么?

如果像这样为屏幕支架创建键(将此对象放在screen state类中),该怎么办:

最后,要显示SnackBar,只需在screen state类中的某个地方使用以下代码:

scaffoldKey.currentState
    .showSnackBar(new SnackBar(content: new Text("Hello")));
或者,您可以将最新的代码包装到如下方法中:

void showInSnackBar(String value) {
scaffoldKey.currentState
    .showSnackBar(new SnackBar(content: new Text(value)));}
然后调用此方法并将快餐店消息传递到内部

如果您想在下一个屏幕上显示“快餐店”消息,在您离开初始上下文后,只需在下一个屏幕上调用“快餐店”方法,而不是在第一个屏幕上


希望这将有帮助

因为显示
SackBar
需要一个活动的
Scaffold
,您需要将消息传递到新的路由页面,比如
getsavedthingrute(消息:“您保存了东西!”)
,新页面负责显示消息


通常我会使用
Navigation.pop({'message':'yousavedthething!','error':false})来传递消息

您必须返回上一页的结果,该结果将表示页面上显示的操作

在第一页中,当您导航到该页时,请更改一些内容

bool result=await Navigator.of(context).push(/*Wherever you want*/);
然后在第二页返回上一页时,将一些结果发送到第一页

Navigator.of(context).pop(true);
如果工作不成功,您可以返回
false

您可以返回任何类型的对象作为结果

然后在第1页中,您可以检查
结果
,并相应地显示
snackBar

bool result=await Navigator.of(context).push(/*Wherever you want*/);
if(result!=null && result==true){
    //Show SnackBar
}else{
    //Some other action if your work is not done
}

以防任何人使用Flushbar插件。在返回语句之前将其放入构建函数中

WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
 
  Flushbar(
    message: "Message from the top",
    flushbarPosition: FlushbarPosition.TOP,
    icon: Icon(
      Icons.info_outline,
      size: 28.0,
      color: Color(0xff00d3fe),
    ),
    flushbarStyle: FlushbarStyle.FLOATING,
    duration: Duration(seconds: 5),
  )..show(_scaffoldKey.currentState.context);
});}
当然别忘了脚手架钥匙

final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final GlobalKey _scaffoldKey=new GlobalKey();

在第二页的类中,重写
initState
方法

@覆盖
void initState(){
super.initState();
//打开此页面后立即显示SnackBar。
未来((){
final snackBar=snackBar(内容:Text('Hello World'));
ScaffoldMessenger.of(上下文)。showSnackBar(snackBar);
});
}

请参阅。在新页面中使用Future.delayed at initState。还可以查看snack_bar_demo+Navigator.of()。push()返回Future,所以您可以等待它,也许?:/我想您也可以选择显示snackbar,从而在导航到下一个屏幕之前通过在
Navigator.of(context.push())
FWIW之前添加延迟来传递信息。您应该
等待
push()
。此外,在
无状态小部件中执行此操作目前不起作用。将小部件更改为有状态对我来说很有效。我不知道为什么会被否决。我试试看,谢谢!谢谢你,黛博拉。我不知道为什么会被否决。如果有些东西不起作用,请让我知道,这样我可以尝试帮助。这是完全有意义的。为什么文档不能这么容易理解FacePalm还应确保此脚手架密钥不在无状态小部件中。它有时会被重新创建,你会得到令人惊讶的bug。它进入一个状态。这是可行的,但您必须在initState中使用WidgetsBinding.instance.addPostFrameCallback(请参阅本文:)。下面是如何做到这一点的:即使我遵循了完整的文档步骤,但上下文更改和我的应用程序崩溃!这是解决方案的第二部分,您能建议我如何在第一页设置snackbar消息吗?谢谢。@Kamlesh OP想在第二页上显示
SnackBar
。我没有得到你要找的东西。您希望何时在第一页上显示
SnackBar
?如果你能提出一个问题并与我分享它的链接,我将能够更好地帮助你。谢谢,我已经解决了我的问题。只需在第一页设置snackbar消息,然后导航到第二页。我可以在第二页看到snackbar消息,设置在第一页。再次感谢。
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
 
  Flushbar(
    message: "Message from the top",
    flushbarPosition: FlushbarPosition.TOP,
    icon: Icon(
      Icons.info_outline,
      size: 28.0,
      color: Color(0xff00d3fe),
    ),
    flushbarStyle: FlushbarStyle.FLOATING,
    duration: Duration(seconds: 5),
  )..show(_scaffoldKey.currentState.context);
});}
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();