如何在Dart中运行重复发生的功能?

Set*_*add 36 dart

我想一遍又一遍地运行一个函数,中间有一个延迟.我怎么能用Dart做到这一点?

Set*_*add 66

您可以使用Timer该类来安排一次性和重复功能.

重复

以下是运行重复函数的方法:

import 'dart:async';
main() {
  const oneSec = const Duration(seconds:1);
  new Timer.periodic(oneSec, (Timer t) => print('hi!'));
}
Run Code Online (Sandbox Code Playgroud)

Timer有两个参数,一个持续时间和一个要运行的函数.持续时间必须是.的实例Duration.回调必须采用一个参数,即定时器本身.

取消重复计时器

使用timer.cancel()取消重复的计时器.这是计时器从重复计时器传递到回调运行的一个原因.

延迟一次性

在延迟之后安排一次性功能(执行一次,将来某个时间):

import 'dart:async';
main() {
  const twentyMillis = const Duration(milliseconds:20);
  new Timer(twentyMillis, () => print('hi!'));
}
Run Code Online (Sandbox Code Playgroud)

请注意,一次性计时器的回调不带参数.

尽快一次性

您还可以请求尽快运行函数,将来至少会有一个事件循环.

import 'dart:async';
main() {
  Timer.run(() => print('hi!'));
}
Run Code Online (Sandbox Code Playgroud)

在HTML中

计时器甚至可以用HTML工作.事实上,window.setTimeout被删除了,所以Timer是将来运行某个功能的唯一方法.


Raf*_*zan 24

5 秒定时器示例

bool isStopped = false; //global

sec5Timer() {
  Timer.periodic(Duration(seconds: 5), (timer) {
    if (isStopped) {
      timer.cancel();
    }
    print("Dekhi 5 sec por por kisu hy ni :/");
  });
}
Run Code Online (Sandbox Code Playgroud)

从任何函数调用

sec5Timer(); 
Run Code Online (Sandbox Code Playgroud)

停止任何功能

isStopped = true;
Run Code Online (Sandbox Code Playgroud)

要处理,您可以使用此代码或技术。

 @override
  void initState() {
    _timer = new Timer.periodic(widget.refreshRate, 
      (Timer timer) => _updateDisplayTime(inheritedWidget));
    super.initState();
  }

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }
Run Code Online (Sandbox Code Playgroud)

  • 就像孟加拉印刷 *Dekhi 5 sec por por kisu hoy ni :/* :D (4认同)

Mat*_* S. 8

您还可以使用 Future.delayed 和 await 来延迟执行:

Future<Null> delay(int milliseconds) {
  return new Future.delayed(new Duration(milliseconds: milliseconds));
}


main() async {
  await delay(500);
  print('Delayed 500 milliseconds');
}
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 8

https://api.dartlang.org/stable/1.24.3/dart-async/Stream/Stream.periodic.html

import 'dart:async';

StreamSubscription periodicSub;

void main() {
  periodicSub = new Stream.periodic(const Duration(milliseconds: 500), (v) => v)
      .take(10)
      .listen((count) => print('tick $count'));
}
Run Code Online (Sandbox Code Playgroud)

或者如果不需要计数器

import 'dart:async';

StreamSubscription periodicSub;

void main() {
  periodicSub = new Stream.periodic(const Duration(milliseconds: 500))
      .take(10)
      .listen((_) => print('tick'));
}
Run Code Online (Sandbox Code Playgroud)