gpt4 book ai didi

dart - Flutter - NavigatorObserver 类是如何工作的?

转载 作者:IT王子 更新时间:2023-10-29 06:50:13 26 4
gpt4 key购买 nike

我试图检测 navigator 何时执行基本操作(pushpop),我发现要实现的类这是 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)丢失了,但我不确定。

有什么建议吗?

提前致谢!

编辑:

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

我有一个推送页面B页面A

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

我想做的就是在 页面 B 弹出时使用 timer.cancel() 取消计时器(使用 Android 上的后退按钮或后退按钮在 appbar 中),因为当 page B 弹出时,计时器仍在执行,即使 page B 已经消失。

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

编辑 2:

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

@override
void dispose() {
timer.cancel();
super.dispose();
}

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

注意:

使用此变通方法,如果我按下主页按钮或在 Android 上打开多任务,计时器仍在执行,当返回到应用程序时,它会重新启动,但计时器仍会再次执行其代码。

最佳答案

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

您想要 NavigatorObserver 的主要时间如果您使用的是 Firebase Analytics 之类的插件。您可以在 plugins repo 中查看示例用法.你通过了 NavigatorObservernavigatorObservers 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com