我试图检测 导航器 何时执行基本操作( 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 已经消失。编辑 2:
-我找到了解决问题的方法,我所做的是取消计时器上的计时器
@override
void dispose() {
timer.cancel();
super.dispose();
}
方法。但我不确定这是否是实现它的最佳方式。
注意:
有了这个解决方法,如果我按下主页按钮或在 Android 上打开多任务,计时器仍在执行,当返回应用程序时,它会重新启动,但计时器仍在执行其代码。
最佳答案
大多数时候你不需要实现 NavigatorObserver
。请参阅 this other StackOverflow answer 解释如何使用 push
和 pop
在路由之间传递信息。在您描述的用例中,应该使用 addListener
将AnimationController
转换为TickerProviderStateMixin
以获得合适的vsync
对象。这可确保您的回调不会在应用程序暂停或处理 State
后触发。 (您可以使用 addListener
或 AnimatedBuilder
而不是 AnimatedWidget
,回调的主要目的是重建小部件树的一部分。)
您需要 NavigatorObserver
的主要时间是您使用的是 Firebase Analytics 之类的插件。您可以在 plugins repo 中看到示例用法。您将 NavigatorObserver
参数中的 navigatorObservers
传递给 MaterialApp
构造函数:
static FirebaseAnalyticsObserver observer =
new FirebaseAnalyticsObserver(analytics: analytics);
...
return new MaterialApp(
navigatorObservers: <NavigatorObserver>[observer],
...
);
有一个实现
State
的 NavigatorObserver
是不寻常的,因为您的 MaterialApp
应该靠近小部件层次结构的顶部。在您构建它时,大多数 State
对象还不存在,因此您将很难将它们放入 navigatorObservers
数组中。您可以改为使用不是 State
的类。如有必要,您可以使用GlobalKey<MyClassState>
查找需要通知的State
(但是,如果这样做,可能会有更简单的方法来完成所需的操作)。关于dart - Flutter - NavigatorObserver 类是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46165705/