在Flutter导航后显示小吃吧

时间:2017-12-20 21:40:05

标签: dart flutter material

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

我想在新页面上显示一个快餐栏以确认操作,但不希望它显示用户是否在没有操作的情况下导航。因此,例如,如果用户保存“东西”,应用程序将它们发送到“事物”主页并显示“已保存”的零食栏,但如果他们以其他方式转到“事物”主页,我​​不希望“保存了“小吃吧”。

这是我保存的面板上的代码,但目标页面没有显示小吃栏 - 无论我在哪里放置小吃店(导航前后),它都不会执行小吃吧。

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!'),
    ),
  );
}

这样做的最佳方式是什么?

6 个答案:

答案 0 :(得分:9)

如果你像这样为屏幕Scaffold创建键(把这个对象放在屏幕状态类中)怎么样:

http://example.com/?zip=ZIPCODE&country%3Dusa=

然后将此变量设置为Scaffold键,如下所示:

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

并在最后显示SnackBar只是在屏幕状态类的某个地方使用此代码:

return new Scaffold(
  key: scaffoldKey,
  appBar: new AppBar(
    .......,
  ),

或者你可以用这样的方法包装最新的代码:

scaffoldKey.currentState
    .showSnackBar(new SnackBar(content: new Text("Hello")));

然后只需调用此方法并传递小吃栏消息。

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

希望这会有所帮助

答案 1 :(得分:2)

在您的 2nd Page 的类中,覆盖 initState 方法

@override
void initState() {
  super.initState();
  
  // Shows the SnackBar as soon as this page is opened. 
  Future(() {
    final snackBar = SnackBar(content: Text('Hello World'));
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  });
}

答案 2 :(得分:1)

由于显示SackBar需要有效Scaffold,因此您需要将消息传递到getSavedThingRoute(message: 'You saved the thing!')之类的新路由页面,新页面负责显示消息。

通常我碰巧使用Navigation.pop({'message': 'You saved the thing!', 'error': false})来传递消息。

答案 3 :(得分:1)

如果有人使用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>();

答案 4 :(得分:0)

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

在第一页中,当您导航到该页面时,请进行一些更改。

bool result=await Navigator.of(context).push(/*Wherever you want*/);

然后,当您返回上一页时,在第二页中将一些结果发送到第一页。

Navigator.of(context).pop(true);

如果工作没有成功,您可以返回false

  

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

然后在第一页中,您可以检查result并相应显示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
}

答案 5 :(得分:0)

在我的情况下,没有显示小吃店的原因是浮动操作按钮,我有一个逻辑来放置晶圆厂与否,当没有晶圆厂时小吃店没有显示,我没有找到合适的解决方案为此,但放置这样的晶圆厂解决了我的问题。 但是把 Container() , null 会导致问题。

 Visibility(
          visible: false,
          child: FloatingActionButton(
              onPressed: () {},
            ),
        );