每x秒钟颤动运行功能

时间:2018-09-29 15:01:26

标签: dart flutter

在我的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的请求,第二个回合是四个请求,第三个回合是八个,依此类推...

有人知道如何解决此问题吗?

2 个答案:

答案 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::它用于更复杂的时间间隔,例如:如果任务需要在一个小时的特定时间运行。让我们看一下图

enter image description here

上图有一个星号,代表出现在特定位置的数字。

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

相关问题