【问题标题】:Flutter: How to perform an actions after Navigator.pushNamedAndRemoveUntil() has completedFlutter:如何在 Navigator.pushNamedAndRemoveUntil() 完成后执行操作
【发布时间】:2021-03-13 10:40:29
【问题描述】:

在我的 Flutter 应用程序中,我需要在按下某个按钮时清除 Navigator 堆栈并返回主页。为了实现这一点,我使用了Navigator.pushNamedAndRemoveUntil(context, "/", (r) => false);。我还需要在导航完成后调用一个函数,也就是说我现在在主页上。

我尝试在Navigator.pushNamedAndRemoveUntil() 上调用.whenComplete() 方法,但它似乎不起作用。 提前致谢。

【问题讨论】:

  • whenComplete 方法中调用函数时是否出错?
  • 不。 whenComplete() 方法根本不会被调用。我刚刚检查了文档并找出了原因。 当推送的路由从导航器中弹出时,返回一个完成传递给 pop 的结果值的 Future。(谈论Navigator.pushNamedAndRemoveUntil()

标签: flutter dart flutter-navigation


【解决方案1】:

我会说在dipose() 中使用您的函数,因此当您导航到另一个屏幕时从树中删除小部件时会调用它。

class _MyPageState extends State<MyPage> {
  
  // ...
  // Some code
  
  @override
  void dispose() {
    // Insert your function here
    super.dispose();
  }
  
  // ...
}

使用didPush()方法

这可用于在导航到另一个屏幕后调用您的函数,因为它会在推送转换完成时返回。但是,您必须使用pushAndRemoveUntil() 而不是pushNamedAndRemoveUntil()。因此,您可以创建一个提供didPush() 方法的PageRoute

// Create your route
MaterialPageRoute route = MaterialPageRoute(
  builder: (context) => HomePage(),
);
// Push the route onto the navigator, and then remove all the previous routes
Navigator.pushAndRemoveUntil(context, route, (r) => false);
// This returns when the push transition is complete.
route.didPush().whenComplete(() {
  // Insert your function here
});

【讨论】:

  • 这并不能真正解决我的问题,因为每次我退出该页面时都会调用该函数。我只需要在按下按钮时调用该函数。
  • 你能试试我刚刚添加的替代方法吗?
  • 我收到此错误消息:未处理的异常:查找已停用小部件的祖先是不安全的。 E/flutter (25278):此时小部件的元素树的状态不再稳定。 E/flutter (25278):要在其 dispose() 方法中安全地引用小部件的祖先,请通过在小部件的 didChangeDependencies() 方法中调用dependOnInheritedWidgetOfExactType() 来保存对祖先的引用。
  • 这可能是因为您试图访问whenComplete() 中不可用的上下文。不要忘记,当didPush() 完成并且您不能使用与之关联的上下文时,此小部件将从三个中删除。
  • 没关系,我已经设法以完全不同的方式解决了导致我的问题的问题。不过,非常感谢您提供的有用提示。
【解决方案2】:

你可以试试这个代码,请告诉我。

gotoNewPage(context) async {
  await Navigator.push(
      context,
      MaterialPageRoute(
          builder: (context) =>
              NewPage()));

/// Your logic is here.
}

【讨论】:

  • 我试过了,不幸的是,它不起作用。看起来 Navigator.push() 一直在等待,因为之后编写的任何代码行都不会被执行。我在您的代码之后尝试使用“print()”,但没有打印任何内容。
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2011-09-07
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多