私はDart/Flutterを初めて使用するので、LinearProgressBarが毎秒更新される単純なアプリを作成したいと考えています。
実際のコードに深く入り込むことなく、次の設定が機能しています。
すべてが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イベントを処理する方法は?
didChangeAppLifecycleState
インターフェースのWidgetBindingObserver
をオーバーライドして、アプリのライフサイクル変更の通知を受け取ることができます。
このページ にサンプルコードがあります
Systemcycles の lifecycle チャネルを使用できます。
例:
SystemChannels.lifecycle.setMessageHandler((msg){
debugPrint('SystemChannels> $msg');
});
出力:
I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed