😁

【Flutter】バックグラウンドでもタイマーの計測を行う方法

2024/01/17に公開

はじめに

現在開発中のアプリで作業時間を記録する機能があります。実際にそれを動かしつつ別作業をしていて、ふと時間を確認すると数十分経っているはずがアプリ上では数十秒しか経っていませんでした。これを解決するために色々調べたり試したので備忘録として残します。

対応方法

  1. バックグラウンドに入ったときの現在時刻とタイマーの時間を取得
  2. 復帰したときの現在時刻を取得
  3. バックグラウンドに入ったときと復帰したときそれぞれの現在時刻の差分秒数を取得
  4. タイマーの時間に差分秒数を加算

コードに起こすとざっくり以下です。

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      // バックグラウンドに遷移した時
      myTimerProvider.handleOnPaused();
      print("バックグラウンド処理");
    } else if (state == AppLifecycleState.resumed) {
      // フォアグラウンドに復帰した時
      myTimerProvider.handleOnResumed();
      print("復帰");
    }
  }
  
  /// アプリがバックグラウンドに遷移した際の処理
  void handleOnPaused() {
    backgroundStartTime = DateTime.now();
  }

  /// アプリがフォアグラウンドに復帰した際の処理
  void handleOnResumed() {
   // タイマーが動いてなければ何もしない
    if (_isCancel == false) return; 
    // バックグラウンドでの経過時間取得
    Duration backgroundDuration =
        DateTime.now().difference(backgroundStartTime); 
    // 経過時間を秒変換してタイマーの時間に加算
    timer = timer.add(
        Duration(seconds: backgroundDuration.inSeconds));
    DateFormat formatter = DateFormat('HH:mm:ss');
    // 画面表示用にタイマーの時間をフォーマット
    time = formatter.format(timer);
  }

おわりに

完全に備忘録ですが、どなたかの参考になれば幸いです。

Discussion