Flutter 应用 UI 在 IOS 从后台重新激活后被冻结

Flutter app UI is frozen after reactivated from background on IOS

我有一个用 Flutter 开发的应用程序,当从后台激活时 IOS 我遇到了一些问题。

在 IOS 上启用了位置背景模式。它在后台工作没有任何问题,即使是几天,它也能完成它必须做的事情。但是当我在后台工作较长时间(大约一天或更长时间)后打开应用程序时,UI 被冻结了!请注意,如果我在几个小时后才这样做,那是可以的,问题会在更长的时间后出现。

颤振版本: [✓] Flutter(频道稳定,1.20.1,在 Mac OS X 10.15.5 19F101,语言环境 hu-HU)

我该如何解决?我应该在 Flutter 中以某种方式重新初始化 UI 吗?或者从本地做任何事情?

非常感谢,非常感谢任何帮助!

上次我在 ios 和 android 上遇到这个问题实际上与我的状态管理器有关,它是 provider 包。 我最终通过在应用程序进入后台并刷新提供程序本身并在每次应用程序从任务管理器打开时重新启动状态时在 sqlite 中保存数据来管理它。

确保您的应用程序的状态在进入后台后以某种方式缓存。它可能在较长时间后不再存在于内存中,并且您的 UI 没有它就无法呈现。

该问题似乎与后台位置获取无关 - 尝试通过 运行 在启用调试的真实设备上使用您的应用来隔离该问题。将其切换到后台并打开一些占用大量内存的应用程序以强制终止您的应用程序。之后打开应用程序并检查日志,应该有某种指示是什么导致了 Flutter UI 冻结。

真正的解决方案可能会参与diff元素。我在搜索以清除此错误时添加并更正了一些内容。但是让它工作的东西(我测试了大约 4-5 小时,它根本没有冻结)大约是 dispatch_queue.

当一个应用程序被挂起时,整个过程都被冻结了。您可以指望进程恢复,就好像恢复后什么也没发生一样。您的应用程序的 GCD 逻辑队列不会消失,它们会保留在内存中。 GCD 在您的进程中为服务队列而创建的线程也恢复到位,就好像什么也没发生一样。

所以您的解释是不正确的:pre-suspension GCD 队列中存在的任务不会在恢复时消失。他们从未离开过;他们只是暂停了。

更多信息请参考inactive/background/suspended states in iOS?

另请参阅Apps Lifecycle State

Flutter更新到1.20.3后,修复了这个bug!