Как обрабатывать onPause / onResume в приложении Flutter?
Я новичок в Dart / Flutter и хотел бы создать простое приложение, где LinearProgressBar обновляется каждую секунду.
Не вдаваясь в фактический код, у меня есть следующая настройка.
- функция, которая вычисляет прогресс, на основе прошедшего времени.
- LinearProgressBar, показывающий прогресс.
- периодический таймер, пересчитывающий ход выполнения и обновляющий индикатор выполнения каждую секунду.
- I debugprint 'tick' каждый раз, когда выполняется пересчет.
все работает как надо за одним исключением. "ТИК" продолжает печататься, когда я перемещаю приложение в фоновом режиме на своем устройстве Android.
на родном Android я бы отменил свой периодический таймер, когда запускается событие "onPause".
есть ли что-то подобное в Flutter? Все, что я мог найти, это "initState" и "dispose". Dispose, однако, не вызывается при перемещении приложение для фона.
Я не хочу, чтобы таймер продолжал тикать в фоновом режиме.
в моем исследовании я нашел этот вопрос переполнения стека onresume-и-onpause-для-виджетов-на-флаттере. Это ответ предлагает использовать 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 самостоятельно?
2 ответов
вы можете переопределить didChangeAppLifecycleState
на WidgetBindingObserver
интерфейс для получения уведомлений для жизненный цикл приложения изменения.
вот пример кода на этой странице
можно использовать жизненный цикл канал SystemChannels.
пример:
SystemChannels.lifecycle.setMessageHandler((msg){
debugPrint('SystemChannels> $msg');
});
выход:
I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed