每隔x秒钟颤动运行功能

aci*_*ito 8 dart flutter

在我的扑动应用程序中,我想每隔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在更新数据的情况下更新视图.

  • 谢谢,就像魅力一样。我也会尝试使用 StreamBuilder 的建议。但有一个问题:dispose 方法中的问号是拼写错误吗? (2认同)
  • 这是有意的,但不是绝对必要的。这只是为了避免在某些其他代码尚未设置计时器或将其设置为null的情况下发生异常。它是零保存的导航运算符。 (2认同)

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