Flutter-NavigatorObserver类如何工作?
问题内容:
我试图检测 导航器 何时执行基本操作( push 和 pop),我发现实现该功能的类是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');
}
}
当然,我在调用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();
}
方法。但是我不确定这是否是实现它的最佳方法。
注意:
通过这种解决方法,如果我按Home(主页)按钮或在Android上打开多任务,计时器仍将执行,当返回应用程序时,计时器将重新启动,但计时器仍将执行其代码。
问题答案:
大多数时候,您不需要实施NavigatorObserver
。请参阅其他StackOverflow答案,以解释如何在路由之间使用push
和pop
传递信息。在你所描述的使用情况下,应addListener
给一个AnimationController
,使用TickerProviderStateMixin
以获得合适的vsync
对象。这样可以确保在应用暂停或State
处置后,您的回调不会触发。(代替addListener
,您可以使用AnimatedBuilder
或AnimatedWidget
回调的主要目的是重建窗口小部件树的一部分。)
您想要的主要时间NavigatorObserver
是使用的是FirebaseAnalytics这样的插件。您可以在插件repo中查看用法示例。您将参数NavigatorObserver
in
传递navigatorObservers
给MaterialApp
构造函数:
static FirebaseAnalyticsObserver observer =
new FirebaseAnalyticsObserver(analytics: analytics);
...
return new MaterialApp(
navigatorObservers: <NavigatorObserver>[observer],
...
);
具有State
实现的是不寻常的,NavigatorObserver
因为您MaterialApp
应该位于小部件层次结构的顶部。在构造它的时候,大多数State
对象还不存在,因此很难将它们放入navigatorObservers
数组中。您可以改用不是的类State
。如有必要,您可以使用GlobalKey<MyClassState>
来查找State
需要通知的消息(但是,如果这样做,可能会有更简单的方法来完成所需的操作)。