Как обрабатывать 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