Flutter - 导航回主页并清除 websocket 连接 - popUntil

Posted

技术标签:

【中文标题】Flutter - 导航回主页并清除 websocket 连接 - popUntil【英文标题】:Flutter - Navigate back to homepage and clear websocket connections - popUntil 【发布时间】:2021-09-21 05:04:37 【问题描述】:

我开发了一个使用 WebSockets 的 Flutter Web 应用程序。有一个用于返回网站登陆页面的按钮,我使用 popUntil 来实现,效果很好,但我发现如果我监控网络选项卡,所有套接字连接仍然打开。

我试图覆盖 dispose() 以关闭 websocket 连接,但后来我发现如果我继续使用该网站,那么我会打开多个其他页面的实例,并使用不同的 websocket 连接。

flutter web 中是否有一种方法可以本质上导航到页面并完全破坏导航堆栈和所有视图/状态?即使只是能够在同一个选项卡中启动重定向并刷新到登录页面(重置所有内容)也很棒。

【问题讨论】:

【参考方案1】:

在离开调用其实例的页面之前,您需要将套接字实例设置为 null。不仅在 dispose() 方法中(当页面状态被销毁时调用 disposed),而且在路由出该页面之前也是如此。只有这样它才不会在后台运行。

【讨论】:

这仍然不起作用。问题是,当我从根页面遍历后返回该页面时,似乎该页面的多个实例打开是多个套接字实例打开。因此,如果我返回第四次 5 次,即使我将所有套接字设置为空,也会打开 5 个套接字连接并发送数据。如果我可以在导航回根时将整个应用程序重置,就像有人点击刷新一样,那会容易得多。在标签上 哦,我明白了,但这本身就是一个不同的问题。你需要的是一个单例类。您不能只创建这些套接字的多个实例。 感谢您的回复。 “改造”现有的有状态小部件并使其成为单例是否容易?我想如果你没有通过 UniqueKey 那么它总是在重用同一个有状态的小部件? (也许我理解错了,我是 Flutter 新手) 您可以打开一个开发工具调试器并查看堆栈页面中存在多少您的状态类。每当在类中调用initState() 时,就会创建该小部件的一个新实例并将其推送到该堆栈的顶部。您可以通过多次路由到同一个状态类并弹回查看堆栈中存在同一个状态类的不同实例来确认这一点。因此,如果您使用动画、流或套接字等,这意味着每次初始化新状态类时都会调用它们。

以上是关于Flutter - 导航回主页并清除 websocket 连接 - popUntil的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动的主页中导航屏幕?

导航返回时不清除文本输入并验证错误消息

react-navigation从引导页跳转到主页,物理回退键,不能再返回到引导页,代码怎么写?

如何在flutter中停用或覆盖appBar中的箭头后退按钮?

Flutter Page 每次在导航弹出时都会重新加载

当我导航回它时,有没有办法更新我的列表视图页面?