在我的扑动应用程序中,我想每隔10秒检查一下我的api.我发现这篇文章每隔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());
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,请求堆积起来:在第一轮"重新启动应用程序"后,有两个请求到api,第二轮是4个请求,第三个是8个等等...
有人知道如何解决这个问题吗?
Gün*_*uer 29
build()
每次Timer.periodic
创建一个new时,可以并且通常会被调用多次.
您需要将这些代码出来的build()
像
Timer timer;
@override
void initState() {
super.initState();
timer = Timer.periodic(Duration(seconds: 15), (Timer t) => checkForNewSharedLists());
}
@override
void dispose() {
timer?.cancel();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
更好的方法是从完全在API层或类似的小部件中移出这些代码,并使用a StreamBuilder
在更新数据的情况下更新视图.
jit*_*555 13
使用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');
});
}
Run Code Online (Sandbox Code Playgroud)
上面的例子取自存储库,它很好地解释了第一个“*”代表分钟,类似的代表小时等等,如图所示。
时间的另一个示例是Schedule.parse(* 1,2,3,4 * * *)
,此计划将在每天凌晨 1 点、凌晨 2 点、凌晨 3 点和凌晨 4 点期间每分钟运行一次。
更多参考 https://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800
归档时间: |
|
查看次数: |
5622 次 |
最近记录: |