web-dev-qa-db-ja.com

FlutterアプリでonPause / onResumeを処理する方法

私はDart/Flutterを初めて使用するので、LinearProgressBarが毎秒更新される単純なアプリを作成したいと考えています。

実際のコードに深く入り込むことなく、次の設定が機能しています。

  • 経過時間に基づいて進行状況を計算する関数。
  • 進行状況を示すLinearProgressBar。
  • 定期的なタイマーが進行状況を再計算し、進行状況バーを毎秒更新します。
  • 私は毎回 'tick'をデバッグプリントし、再計算が行われます。

すべてが1つの例外を除いて期待どおりに機能しています。 Androidデバイスのバックグラウンドでアプリを移動すると、「ティック」が印刷され続けます。

ネイティブAndroidでは、「onPause」イベントがトリガーされたときに定期的なタイマーをキャンセルします。

Flutterにも同様のものはありますか?私が見つけたのは「initState」と「dispose」だけでした。ただし、アプリをバックグラウンドに移動するときにDisposeが呼び出されません。

タイマーがバックグラウンドでカチカチ音を立て続けてほしくありません。

私の調査で、このスタックオーバーフローの質問 onresume-and-onpause-for-widgets-on-flutter が見つかりました。 TickerProviderStateMixin を使用することをお勧めします。

次のように使いました。

class _BarItemState extends State<BarItem> with SingleTickerProviderStateMixin {
    Ticker ticker;
    num progress = 1.0;

    @override
    void initState() {
       super.initState();
       ticker = createTicker((duration) => setState(() {
          debugPrint('tick');
          progress = duration.inSeconds / 30;
       }))
      ..start();
    }

    // other stuff omitted

}

動作していますが、まだ満足できません。

その理由は、ティッカーコールバックが1秒に1回ではなく数ミリ秒ごとに呼び出されるようになったためです。これはリソースの浪費のように見えます(スムーズなアニメーションは必要ありません)。..複雑すぎますか?

私のユースケースでは必要ないと思われる場合でも、私は知りたいです:

自分でonPause/onResumeイベントを処理する方法は?

14
forgemo

didChangeAppLifecycleStateインターフェースのWidgetBindingObserverをオーバーライドして、アプリのライフサイクル変更の通知を受け取ることができます。

このページ にサンプルコードがあります

15
amir

Systemcycleslifecycle チャネルを使用できます。

例:

SystemChannels.lifecycle.setMessageHandler((msg){
  debugPrint('SystemChannels> $msg');
});

出力:

I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed
9
German Saprykin