我正在尝试创建一个计时器应用,该应用具有多个用于不同任务的倒数计时器。我面临的问题是,如果我启动一个计时器,然后按返回按钮,计时器将停止。所以我想让计时器一直运行到暂停或计时器结束并提醒用户或应用程序销毁。请帮助我如何使用Flutter做到这一点?我也使用sql-lite存储所有计时器。
答案 0 :(得分:3)
隔离不会解决问题。当应用程序在后台运行时,隔离甚至会被操作系统暂停。我已经尝试过了(在Android10计时器中,计时器运行了大约100秒钟才被系统暂停)。
针对您的问题,似乎使用了Android_Alarm_Manager软件包。 但它仅支持android。尚无ios支持
答案 1 :(得分:2)
我遇到了类似的问题。 隔离不会解决它,因为隔离生命周期也链接到主隔离(ui 线程)。 我创建了一个解决方法,即我使用了 dateTime 属性,因此如果用户选择 30 分钟,则最终日期时间变为 Date time.now(Duration (minutes:30));。 还有一个定时器周期函数,它每分钟运行一次,并找出最终日期时间和 datetime.now() 之间的差异,所以即使当你重新打开应用程序时操作系统在后台应用程序托盘中杀死了你的应用程序,时间也会自动更新为改变。 我还使用 flutter 通知包在计时器值变为零时提醒用户
答案 2 :(得分:0)
啊,后台任务! 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中创建隔离时,它会旋转另一个线程来执行繁重的任务,或者只是在应用程序可能或可能不集中时执行某些操作。这样,主线程可以加载UI之类的东西,而在另一个线程中,它可以照顾您放入其中的其他内容,因此,可以提高应用程序的性能。
它与您的问题有什么关系?
您可以使用“隔离”在应用程序后台(无论是否打开)执行任务。
本文(足够方便)介绍了隔离中的计时器:
https://codingwithjoe.com/dart-fundamentals-isolates/
从本质上讲,它在隔离区中使用Timer.periodic
来执行对于您的场景而言完美的任务。