dart 在onPressed中执行Navigator.pop(context)之后,其余的行仍然会被执行,怎么做?

bpzcxfmw  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(106)
onPressed: () {
                Navigator.pop(context);
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (ctx) => const Filter(),
                  ),
                );
              },

这是我的代码。我的问题是,即使我弹出了当前屏幕,onpressed函数的其余行仍然有效。谁能解释一下onPressed()函数是如何工作的?

k10s72fa

k10s72fa1#

如果我理解了代码的逻辑,那么您希望通过Navigator. Pop导航。在onPressed中,Navigator.pop不是一个return,所以你仍然会执行Navigator.push。
你要做的是:您调用Navigator.push before,它将您重定向到此页面。push是一个future,这意味着你可以使用wait关键字。
在等待之后,您将调用

Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (ctx) => const Filter(),
                  ),
                );
wsxa1bj1

wsxa1bj12#

这很正常

**Navigator.pop(context);**将从导航堆栈中删除顶部的Route,而Navigator.push()将把另一个路由推送到导航堆栈中

这并不意味着第二条语句不会被执行,因为这两条语句都是函数的一部分,它们将按顺序执行。
在这种情况下,您应该使用if else语句

hwamh0ep

hwamh0ep3#

一个方法将按顺序执行给它的指令。
如果对Navigator.pop的调用没有抛出异常(这将导致整个方法崩溃),则将执行其余指令,在您的情况下是对Navigator.push的调用。对context的引用可能在弹出后被修改,但请记住,它不会停止执行。
如果你看一下popAndPushNamed方法的文档,你会发现它和你的实现很相似:

Future<T?> popAndPushNamed<T extends Object?, TO extends Object?>(
  String routeName, {
  TO? result,
  Object? arguments,
}) {
  pop<TO>(result);
  return pushNamed<T>(routeName, arguments: arguments);
}

相关问题