在iOS上从后台重新激活后,Flutter应用程序UI被冻结

问题描述

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

已启用在IOS上使用位置背景模式。它可以在后台正常运行,即使几天,也可以完成它所要做的事情。但是,当我在后台工作了更长的时间(大约一天或更长时间)后打开应用程序时,UI被冻结了!请注意,如果我在几个小时后执行此操作,就可以了,问题会在较长一段时间后出现。

Flutter版本: [✓] Flutter(在Mac OS X 10.15.5 19F101上为Channel稳定,版本为1.20.1,语言环境为hu-HU)

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

非常感谢,我们非常感谢您的帮助!

解决方法

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

该问题似乎与后台位置获取无关-请尝试通过在启用了调试功能的真实设备上运行您的应用程序来解决该问题。将其切换到后台并打开一些内存消耗大的应用程序以强制终止应用程序。打开应用程序并检查日志后,应该有某种指示来指示Flutter UI冻结的原因。

,

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

,

真正的解决方案可能涉及diff元素。我在寻找清除此bug时添加并更正了这些内容。但是使它工作的东西(我测试了大约4-5小时,并且完全没有冻结)是关于dispatch_queue的。

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

因此您的解释不正确:暂停前GCD队列中存在的任务在恢复后不会消失。他们从来没有离开过。他们只是被暂停了。

有关更多信息,请参阅inactive/background/suspended states in iOS?

另请参阅Apps Lifecycle State

,

将Flutter更新到1.20.3后,此错误已修复!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...