web-dev-qa-db-ja.com

Dartで定期的な関数を実行するにはどうすればよいですか?

関数を何度も繰り返し実行したいのですが、間に遅延があります。 Dartでこれを行うにはどうすればよいですか?

42
Seth Ladd

Timerクラスを使用して、ワンショット関数と繰り返し関数をスケジュールできます。

繰り返す

繰り返し関数を実行する方法は次のとおりです。

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

Timerは、期間と実行する関数の2つの引数を取ります。期間はDurationのインスタンスでなければなりません。コールバックは単一のパラメーター(タイマー自体)を取る必要があります。

繰り返しタイマーのキャンセル

繰り返しタイマーをキャンセルするには、timer.cancel()を使用します。これが、タイマーが繰り返しタイマーから実行されるコールバックに渡される1つの理由です。

遅延後のワンショット

遅延後にワンショット機能をスケジュールするには(一度実行して、後で実行します):

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

ワンショットタイマーのコールバックはパラメーターを取りません。

できるだけ早くワンショット

また、関数をできるだけ早く実行するように要求することもできます。少なくとも1つのイベントループティックが将来は実行されます。

_import 'Dart:async';
main() {
  Timer.run(() => print('hi!'));
}
_

HTMLで

タイマーはHTMLでも機能します。実際、_window.setTimeout_は削除されたので、Timerは将来関数を実行する唯一の方法です。

88
Seth Ladd

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

または、カウンターが不要な場合

import 'Dart:async';

StreamSubscription periodicSub;

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

Future.delayedを使用して、実行を遅らせることもできます。

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


main() async {
  await delay(500);
  print('Delayed 500 milliseconds');
}
6
Matt S.

代替;

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();
});
5
Ahmet Şimşek

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 :/");
  });
}

任意の関数からの呼び出し

sec5Timer(); 

すべての機能から停止

isStopped = true;

処分するには、このコードまたは手法を使用できます。

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

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }