Flutter-NavigatorObserver类如何工作?

Sal*_*ala 2 dart flutter

我试图检测导航器何时执行基本操作(pushpop),我发现实现该功能的类是NavigatorObserver类,但是找不到如何工作的示例。

我已经尝试实现接口:

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');
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,我在调用Navigator.of(context).push(...); 但是重写方法永远不会被调用。

我怀疑与导航器的绑定丢失了,但是我不确定。

有什么建议么?

提前致谢!

编辑:

我认为我想做的事情很简单,但是我不知道该怎么做。

我有一个网页A是推动网页B

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

所有我想要做的就是取消与计时器timer.cancel()时,网页B得到弹出了(与Android或后退按钮在appbar后退按钮),因为当网页B得到弹出仍在执行即使定时器网页B有没了

  • 我无法通过Navigator.pop()将计时器作为参数传递,因为我不处理后退按钮(应用程序栏中的后退按钮和Android后退按钮)。

编辑2:

-我找到了解决问题的方法,我所做的就是取消计时器

@override
void dispose() {
  timer.cancel();
  super.dispose();
}
Run Code Online (Sandbox Code Playgroud)

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

注意:

通过这种解决方法,如果我按Home按钮或在Android上打开多任务,计时器仍将执行,当返回应用程序时,计时器将重新启动,但计时器仍将执行其代码。

Are*_*res 13

// Register the RouteObserver as a navigation observer.
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
void main() {
  runApp(MaterialApp(
    home: Container(),
    navigatorObservers: [routeObserver],
  ));
}

class RouteAwareWidget extends StatefulWidget {
  State<RouteAwareWidget> createState() => RouteAwareWidgetState();
}

// Implement RouteAware in a widget's state and subscribe it to the RouteObserver.
class RouteAwareWidgetState extends State<RouteAwareWidget> with RouteAware {

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
  }

  @override
  void dispose() {
    routeObserver.unsubscribe(this);
    super.dispose();
  }

  @override
  void didPush() {
    // Route was pushed onto navigator and is now topmost route.
  }

  @override
  void didPopNext() {
    // Covering route was popped off the navigator.
  }

  @override
  Widget build(BuildContext context) => Container();

}
Run Code Online (Sandbox Code Playgroud)

这是更详细的帮助指南。 https://medium.com/flutter-community/how-to-track-screen-transitions-in-flutter-with-routeobserver-733984a90dea

  • 所有这些示例都显示了单个“文件”中的所有代码,您将如何从另一个文件中声明的屏幕访问routeObserver。 (4认同)
  • 对于OP解释为什么这是已经提供和接受的答案的一个很好的替代方案可能会更有帮助。这对您来说可能是显而易见的,但对其他读者来说并不明显。 (3认同)
  • 您会将这段代码放在您想观看的每个页面上吗?如果是的话,如果我想观看应用程序中的所有页面以在更改时运行函数怎么办 (2认同)

Col*_*son 5

大多数时候,您不需要实施NavigatorObserver。请参阅其他StackOverflow答案,以解释如何在路由之间使用pushpop传递信息。在你所描述的使用情况下,应addListener给一个AnimationController,使用TickerProviderStateMixin以获得合适的vsync对象。这样可确保在应用暂停或State处置后,您的回调不会触发。(代替addListener,您可以使用AnimatedBuilderAnimatedWidget回调的主要目的是重建小部件树的一部分。)

您想要的主要时间NavigatorObserver是使用的是Firebase Analytics这样的插件。您可以在插件repo中查看用法示例。您将参数NavigatorObserverin 传递navigatorObserversMaterialApp构造函数:

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

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