我正在尝试创建一个计时器应用程序,该应用程序具有多个用于不同任务的倒数计时器。问题,我面临的是,如果我启动一个计时器,然后按返回按钮,计时器就会停止。所以我想要,该计时器一直运行到它被暂停或计时器结束并提醒用户或应用程序被破坏。帮助我如何使用 Flutter 做到这一点?我也使用 sql-lite 来存储所有计时器。
3 回答
啊,后台任务!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 在您的应用程序(打开或未打开)的后台执行任务。
本质上,它Timer.periodic在隔离内部使用来执行非常适合您的场景的任务。
隔离不能解决问题。当应用程序在后台时,即使隔离也会被操作系统暂停。我已经尝试过了(在 Android10 中,计时器在被系统暂停之前运行了大约 100 秒)。
对于您的问题 Android_Alarm_Manager 包似乎是解决方案。但它只支持安卓。还没有ios支持
我有一个类似的问题。隔离不会解决它,因为隔离生命周期也链接到主隔离(ui 线程)。我创建了一个解决方法,即我使用了 dateTime 属性,因此如果用户选择 30 分钟,则最终日期时间变为 Date time.now(Duration (minutes:30));。还有一个定时器周期函数,它每分钟运行一次,并找到最终日期时间和 datetime.now() 之间的差异,所以即使当你重新打开应用程序时操作系统在后台应用程序托盘中杀死你的应用程序,时间也会自动更新为改变。当计时器值变为零时,我还使用了颤振通知包来提醒用户