在我的flutter应用程序内部,我想每10秒检查一次我的api。我发现this post每x时间运行一次函数,并执行以下操作:
class _MainPage extends State<MainPage> {
int starter = 0;
void checkForNewSharedLists(){
// do request here
setState((){
// change state according to result of request
});
}
Widget build(BuildContext context) {
Timer.periodic(Duration(seconds: 15), (Timer t) => checkForNewSharedLists());
}
}
不幸的是,请求堆积如山:在第一个“回合”上重启应用程序后,有两个对api的请求,第二个回合是四个请求,第三个回合是八个,依此类推...
有人知道如何解决此问题吗?
答案 0 :(得分:13)
build()
时, Timer.periodic
通常可以被调用一次以上。
您需要将该代码移出build()
,例如
Timer timer;
@override
void initState() {
super.initState();
timer = Timer.periodic(Duration(seconds: 15), (Timer t) => checkForNewSharedLists());
}
@override
void dispose() {
timer?.cancel();
super.dispose();
}
更好的方法是将这样的代码完全从API层或类似层的小部件中移出,并使用StreamBuilder
来在数据更新的情况下更新视图。
答案 1 :(得分:2)
使用Cron lib,它将定期运行,但是Timer和Cron之间有区别,
计时器:它以给定的特定时间间隔运行任务,无论是秒,分钟还是小时。
Cron::它用于更复杂的时间间隔,例如:如果任务需要在一个小时的特定时间运行。让我们看一下图
上图有一个星号,代表出现在特定位置的数字。
import 'package:cron/cron.dart';
main() {
var cron = new Cron();
cron.schedule(new Schedule.parse('*/3 * * * *'), () async {
print('every three minutes');
});
cron.schedule(new Schedule.parse('8-11 * * * *'), () async {
print('between every 8 and 11 minutes');
});
}
以上示例均来自存储库,它很好地说明了第一个'*'代表分钟,类似于小时,依此类推,如图所示。
小时的另一个示例为Schedule.parse(* 1,2,3,4 * * *)
,该计划将在每天的凌晨1点,凌晨2点,凌晨3点和凌晨4点之间每分钟运行一次。>
更多参考 https://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800