如何 运行 在 flutter 后台计时?

How to run clock timer in background on flutter?

我正在尝试创建一个计时器应用程序,它具有针对不同任务的多个倒数计时器。我面临的问题是,如果我启动一个计时器,然后按后退按钮,计时器就会停止。所以我想,那个计时器 运行 直到它被暂停或计时器结束并提醒用户或应用程序是 destroyed.Help 我如何使用 Flutter 做到这一点?我还使用 sql-lite 来存储所有计时器。

啊,后台任务! Dart(Flutter 使用的语言)是单线程.

single-threaded 是什么意思?

Dart 等单线程语言有一种叫做事件循环的东西。这意味着 Dart 逐行运行代码(除非您使用 Futures 但在这种情况下这对您没有帮助)。它注册按钮点击等事件并等待用户按下它们等。

我推荐这篇关于单线程的文章和视频:

https://medium.com/dartlang/dart-asynchronous-programming-isolates-and-event-loops-bffc3e296a6a

https://www.youtube.com/watch?v=vl_AaCgudcY&feature=emb_logo

无论如何,解决这个问题的方法(如上面的文章和视频中所述)是隔离。当您在 Dart 中创建一个 Isolate 时,它​​会启动另一个线程来执行繁重的任务或仅在应用程序可能处于焦点或可能不处于焦点时执行某些操作。这样,主线程可以加载 UI 之类的东西,而在另一个线程中,它会处理您放入其中的其他东西,因此可以提高应用程序的性能。

它与您的问题有什么关系?

您可以使用 Isolates 在您的应用程序后台执行任务(打开或关闭)。

本质上,它在 isolate 中使用 Timer.periodic 来执行任务,完美 适合您的场景。

孤立解决不了问题。当应用程序处于后台时,甚至隔离也会被 OS 暂停。我试过了(在 Android10 中,计时器在被系统暂停之前运行了大约 100 秒)。

对于您的问题 Android_Alarm_Manager 软件包似乎是解决方案。 但它只支持android。尚无 ios 支持

我遇到了类似的问题。 隔离不会解决它,因为隔离生命周期也链接到主隔离(ui 线程)。 我有点创建了一个解决方法,即我使用了 dateTime 属性,所以如果用户选择 oses 30 分钟,最后的日期时间变成 Date time.now(Duration (minutes:30) );. 还有一个计时器周期性函数,它每分钟运行一次,并找出最终日期时间和日期 time.now() 之间的差异,因此即使 os 在您重新打开后台应用程序托盘时杀死了您的应用程序app,时间自动更新到变化。 我还使用 flutter 通知包在计时器值变为零时提醒用户