如何在 Flutter App 中处理 onPause/onResume?
How to handle onPause/onResume in Flutter App?
我是 Dart/Flutter 的新手,想构建一个简单的应用程序,其中 LinearProgressBar 每秒更新一次。
无需深入了解实际代码,我可以使用以下设置。
- 根据经过的时间计算进度的函数。
- 显示进度的 LinearProgressBar。
- 一个周期性的定时器,每秒重新计算进度并更新进度条。
- 我每次都debugprint 'tick',重新计算完成
一切都按预期进行,只有一个例外。当我在 Android 设备的后台移动应用程序时,'tick' 不断打印。
在本机 Android 上,我会在触发 'onPause' 事件时取消我的定期计时器。
Flutter 有类似的东西吗?我能找到的只有 'initState' 和 'dispose'。但是,将应用移至后台时不会调用 Dispose。
我不希望计时器在后台继续滴答作响。
在我的研究中,我发现了这个 Stack Overflow 问题 . It's answer suggests using 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
}
效果不错,但我还是不满意。
原因是,现在每几毫秒调用一次代码回调,而不是每秒调用一次。在我看来,这似乎是在浪费资源(我不需要流畅的动画),……我是不是把事情搞得太复杂了?
即使我的用例似乎不需要它,我仍然想知道:
如何自己处理onPause/onResume事件?
您可以使用 lifecycle channel from SystemChannels.
示例:
SystemChannels.lifecycle.setMessageHandler((msg){
debugPrint('SystemChannels> $msg');
});
输出:
I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed
您可以覆盖 WidgetBindingObserver
界面的 didChangeAppLifecycleState
以接收 app lifecycle 更改的通知。
中有示例代码
我是 Dart/Flutter 的新手,想构建一个简单的应用程序,其中 LinearProgressBar 每秒更新一次。
无需深入了解实际代码,我可以使用以下设置。
- 根据经过的时间计算进度的函数。
- 显示进度的 LinearProgressBar。
- 一个周期性的定时器,每秒重新计算进度并更新进度条。
- 我每次都debugprint 'tick',重新计算完成
一切都按预期进行,只有一个例外。当我在 Android 设备的后台移动应用程序时,'tick' 不断打印。
在本机 Android 上,我会在触发 'onPause' 事件时取消我的定期计时器。
Flutter 有类似的东西吗?我能找到的只有 'initState' 和 'dispose'。但是,将应用移至后台时不会调用 Dispose。
我不希望计时器在后台继续滴答作响。
在我的研究中,我发现了这个 Stack Overflow 问题
我是这样用的
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
}
效果不错,但我还是不满意。
原因是,现在每几毫秒调用一次代码回调,而不是每秒调用一次。在我看来,这似乎是在浪费资源(我不需要流畅的动画),……我是不是把事情搞得太复杂了?
即使我的用例似乎不需要它,我仍然想知道:
如何自己处理onPause/onResume事件?
您可以使用 lifecycle channel from SystemChannels.
示例:
SystemChannels.lifecycle.setMessageHandler((msg){
debugPrint('SystemChannels> $msg');
});
输出:
I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed
您可以覆盖 WidgetBindingObserver
界面的 didChangeAppLifecycleState
以接收 app lifecycle 更改的通知。