如何在Flutter中的navigator.pop(context)之后显示小吃栏?

时间:2018-07-10 08:12:52

标签: dart flutter navigator snackbar

我们需要关闭一个屏幕,然后打开第二个屏幕。并在第一个屏幕的第二个屏幕上显示小吃店。

我尝试使用OnetoOne,但是此屏幕已经打开,并且出现错误“状态错误:流已经被收听”。

4 个答案:

答案 0 :(得分:2)

我建议您使用Flushbar插件代替Flukebar插件,它很容易使用,它将处理所有问题,您可以在很大程度上自定义它。 Snackbar需要一个脚手架祖先才能工作,但是 Flushbar不会,它会自己处理所有多余的东西,并提供大量的炫酷功能。

Flushbar Plugin here

答案 1 :(得分:1)

我不确定我是否100%理解了您的用例,但是通过从屏幕返回结果并将参数传递给新路线,您基本上可以解决任何情况。

让我们举个例子。 A是原始屏幕,然后按屏幕B。现在,您将看到B,在该屏幕上执行一些操作,然后将其弹出,返回到屏幕A,并想要显示一个小吃栏。

pop时,您可以返回结果并按照"Return data from a screen"食谱中的说明从“父”屏幕处理该结果。

收到结果后,您可以显示小吃店通知,或者可以选择{如果有第三个屏幕,则可以pass that result to another screen as argument

答案 2 :(得分:0)

showSubmitRequestSnackBar(BuildContext context) async {

  Flushbar(
    flushbarPosition: FlushbarPosition.BOTTOM,
    message: "Request Successfully Saved",
    icon: Icon(
      Icons.info_outline,
      size: 28.0,
      color: Colors.red,
    ),
    backgroundColor: Colors.red,
    duration: Duration(seconds: 5),
    leftBarIndicatorColor: Colors.red,

  )
    ..show(context).then((r)=> Navigator.push(
        context, MaterialPageRoute(builder: (context) => ListPage(""))));
}

答案 3 :(得分:0)

屏幕 A

Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => BScreen(
      callbackFunction: (String resMessage){
        print(resMessage);
      },
    ),
  ),
);

屏幕 B

class BScreen extends StatefulWidget {
  final Function callbackFunction;

  BScreen({required this.callbackFunction});

  @override
  _BScreenState createState() => _BScreenState();
}


class _BScreenState extends State<BScreen> {
  // 
  _performTask(){
    // add your task here
    // ..........
    String msg = 'Task has been added';
    widget.callbackFunction(msg);
    Navigator.of(context).pop();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _performTask();
          },
          child: Text('Click Here'),
        ),
      ),
    );
  }
}

这个解决方案对我有用。乐于帮助他人 :) 感谢您提出这个问题。