How do I run a reoccurring function, in Dart?

2019-01-14 07:16发布

问题:

I'd like to run a function over and over, with a delay in between. How can I do this with Dart?

回答1:

You can use the Timer class to schedule one-shot and repeating functions.

Repeating

Here is how you run a repeating function:

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

The Timer takes two arguments, a duration and a function to run. The duration must be an instance of Duration. The callback must take a single parameter, the timer itself.

Canceling a repeating timer

Use timer.cancel() to cancel a repeating timer. This is one reason why timer is passed to the callback run from a repeating timer.

One-shot after a delay

To schedule a one-shot function after a delay (execute once, some time in the future):

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

Notice the callback for a one-shot timer does not take a parameter.

One-shot as soon as possible

You can also request that a function is run as soon as possible, at least one event-loop tick in the future.

import 'dart:async';
main() {
  Timer.run(() => print('hi!'));
}

In HTML

Timers even work in HTML. In fact, window.setTimeout was removed, so Timer is the only way to run a function in the future.



回答2:

You can also use Future.delayed and await to delay execution:

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


main() async {
  await delay(500);
  print('Delayed 500 milliseconds');
}


回答3:

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'));
}

or if the counter isn't required just

import 'dart:async';

StreamSubscription periodicSub;

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


回答4:

alternative;

Timer interval(Duration duration, func) {
  Timer function() {
    Timer timer = new Timer(duration, function);

    func(timer);

    return timer;
  }

  return new Timer(duration, function);
}

int i = 0;

interval(new Duration(seconds: 1), (timer) {
  print(i++);

  if (i > 5) timer.cancel();
});


标签: dart