Dart| Flutter: 用延迟定时器重复执行一个函数的多种方法

1,529 阅读2分钟

本教程展示了在dart和flutter编程中用延迟定时器重复执行一个函数的多种方法。

我们有多种方法可以用延迟时间周期性地执行一个代码函数:

  • 使用Timer Periodic方法

Timer.Periodic() 方法允许你创建一个定时器。

Timer Timer.periodic(Duration duration, void Function(Timer) callback)

它接受持续时间和回调函数参数。

并且,重复执行持续时间定时器的回调函数。

下面是一个每分钟重复运行一个打印语句的例子

import 'dart:async';

main() {
  const oneMinute = Duration(minutes: 1);
  Timer.periodic(oneMinute, (Timer t) {
    print('Hello Welcome:  ' + new DateTime.now().toString());
  });
}

输出:

Hello Welcome:  2022-03-30 09:42:52.810
Hello Welcome:  2022-03-30 09:43:52.825
Hello Welcome:  2022-03-30 09:44:52.814
Hello Welcome:  2022-03-30 09:45:52.818
Hello Welcome:  2022-03-30 09:47:26.838
Hello Welcome:  2022-03-30 09:48:26.815
Hello Welcome:  2022-03-30 09:49:26.814
Hello Welcome:  2022-03-30 09:50:26.840
Hello Welcome:  2022-03-30 09:51:26.823
Hello Welcome:  2022-03-30 09:52:26.810
Hello Welcome:  2022-03-30 09:53:26.830
Hello Welcome:  2022-03-30 09:54:26.847
  • 使用StreamSubscription周期类 StreamSubscription类提供了对Stream类的事件订阅。

  • 使用Stream.periodic()方法创建一个流

  • 它创建了一个Stream,在一个持续时间段内重复地发射事件,对象配置为

Stream Stream.periodic(Duration period, [dynamic Function(int)? computation])
  • take(n) 方法在Stream对象上允许执行n次的计数。
  • listen() 事件捕获发射的事件并执行函数。箭头函数被用来执行。
import 'dart:async';

main() {
  StreamSubscription streamSubscription;

  const oneSecond = Duration(seconds: 1);

  streamSubscription = new Stream.periodic(oneSecond)
      .take(5)
      .listen((_) => print('Hello Welcome:  ' + new DateTime.now().toString()));
}

输出:

Hello Welcome:  2022-03-30 10:29:29.211
Hello Welcome:  2022-03-30 10:29:30.209
Hello Welcome:  2022-03-30 10:29:31.209
Hello Welcome:  2022-03-30 10:29:32.209
Hello Welcome:  2022-03-30 10:29:33.813

与Timer.Periodic相比,这种方法有更多的优点:

  • 第一次执行立即运行
  • 回调执行次数可以被配置并限制在n次。

总结

综上所述,我们可以使用Timer和Stream周期性方法来重复执行函数,并配置持续时间。