我试图检测 导航器 何时执行基本操作( push pop ),我发现实现此目的的类是使用 NavigatorObserver 类,但我找不到有关它的示例作品。

我已经尝试过实现接口(interface):

class MyClassState extends State<MyClass> with NavigatorObserver{

    ....

    @override
    void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
        print('This is never get called');
    }

    @override
    void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
        print('This is never get called');
    }
}

当然我调用 Navigator.of(context).push(...);但是覆盖方法永远不会被调用。

我怀疑缺少与导航器的绑定(bind),但我不确定。

有什么建议么?

提前致谢!

编辑:

我想我想做的很简单,但我不知道如何去做。

我有一个 页面 A ,它插入 页面 B

页面 B 我有一个 周期性计时器 必须 在那里(在 页面 B 上)。

我想要做的就是在 页面 B 弹出时使用 timer.cancel() 取消计时器(Android 上的后退按钮或应用程序栏中的后退按钮),因为当 页面 B 弹出时,计时器仍然在执行如果 页面 B 已经消失。
  • 我无法将计时器作为参数传递给 Navigator.pop(),因为我不处理后退按钮(应用栏中的按钮和 Android 后退按钮)。

  • 编辑 2:

    -我找到了解决问题的方法,我所做的是取消计时器上的计时器
    @override
    void dispose() {
      timer.cancel();
      super.dispose();
    }
    

    方法。但我不确定这是否是实现它的最佳方式。

    注意:

    有了这个解决方法,如果我按下主页按钮或在 Android 上打开多任务,计时器仍在执行,当返回应用程序时,它会重新启动,但计时器仍在执行其代码。

    最佳答案

    大多数时候你不需要实现 NavigatorObserver 。请参阅 this other StackOverflow answer 解释如何使用 pushpop 在路由之间传递信息。在您描述的用例中,应该使用 addListener AnimationController转换为TickerProviderStateMixin以获得合适的vsync对象。这可确保您的回调不会在应用程序暂停或处理 State 后触发。 (您可以使用 addListenerAnimatedBuilder 而不是 AnimatedWidget ,回调的主要目的是重建小部件树的一部分。)

    您需要 NavigatorObserver 的主要时间是您使用的是 Firebase Analytics 之类的插件。您可以在 plugins repo 中看到示例用法。您将 NavigatorObserver 参数中的 navigatorObservers 传递给 MaterialApp 构造函数:

    static FirebaseAnalyticsObserver observer =
      new FirebaseAnalyticsObserver(analytics: analytics);
    ...
    return new MaterialApp(
      navigatorObservers: <NavigatorObserver>[observer],
      ...
    );
    

    有一个实现 StateNavigatorObserver 是不寻常的,因为您的 MaterialApp 应该靠近小部件层次结构的顶部。在您构建它时,大多数 State 对象还不存在,因此您将很难将它们放入 navigatorObservers 数组中。您可以改为使用不是 State 的类。如有必要,您可以使用GlobalKey<MyClassState>查找需要通知的State(但是,如果这样做,可能会有更简单的方法来完成所需的操作)。

    关于dart - Flutter - NavigatorObserver 类是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46165705/

    10-09 04:23