Flutterアプリを作るためのプログラミング言語であるDartでは、一定時間(間隔)を開けてから行う処理としてTimerというクラスが用意されており、一定時間の間隔で連続して処理を行う場合は、Timer.periodic名前付きコンストラクタが用意されています。
このTimer.periodicを使う際に、ある条件に合致するとTimer処理をキャンセルすることになりますが、キャンセルされてもすでに発動されているコールバック関数(上の画像でいう「doSomething」)は最後まで実行されるので注意が必要です(timer.cancelのあとに書かれている処理も実行される)。
Once a Timer has been canceled, the callback function will not be called by the timer.
(Timerが一旦キャンセルされると、そのTimerによって(次の)コールバック関数は呼び出されない=「今実行されているコールバック関数は最後まで実行される」
たとえば、以下は、1秒毎に「counter」変数を1つ繰り下げてカウントダウン処理を行い、「counter」の数値が「0」になるとTimer処理をキャンセルさせるコード例ですが、
var counter = 3; Timer.periodic(const Duration(seconds: 1), (timer) { print(counter.toString()); if (counter == 0) { print('Cancel timer'); timer.cancel(); } counter--; print("1回の処理完了"); });
Timer処理をキャンセルさせた場合でも、すでに発動されているコールバック関数は最後まで実行されますので、「timer.cancel()」のあとに記述されている
counter--; print("1回の処理完了");
も実行されるので、出力結果はこのようになるということです。
3 1回の処理完了 2 1回の処理完了 1 1回の処理完了 0 Cancel timer 1回の処理完了 //<= コレも実行される
(詳しくは、以下の動画で解説していますので、よろしければご覧下さい)