Как обрабатывать onPause / onResume в приложении Flutter?

Я новичок в Dart / Flutter и хотел бы создать простое приложение, в котором LinearProgressBar обновляется каждую секунду.

Не вдаваясь в фактический код, у меня работает следующая настройка.

  • Функция, которая вычисляет прогресс на основе прошедшего времени.
  • LinearProgressBar, показывающий прогресс.
  • Периодический таймер, пересчитывающий прогресс и обновляющий индикатор выполнения каждую секунду.
  • Я каждый раз отлаживаю галочку, пересчет сделан.

Все работает как положено, за одним исключением. «Галочка» продолжает печататься, когда я перемещаю приложение в фоновый режим на своем устройстве Android.

На родном Android я бы отменил свой периодический таймер при срабатывании события onPause.

Во Flutter есть что-то подобное? Все, что я смог найти, это «initState» и «dispose». Однако Dispose не вызывается при перемещении приложения в фоновый режим.

Я не хочу, чтобы таймер продолжал работать в фоновом режиме.

В своем исследовании я нашел этот вопрос о переполнении стека onresume-and-onpause-for- виджеты-на-флаттере. В ответе предлагается использовать 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?


person forgemo    schedule 12.11.2017    source источник


Ответы (2)


Вы можете переопределить didChangeAppLifecycleState интерфейса WidgetBindingObserver, чтобы получать уведомления об изменениях жизненного цикла приложения.

На этой странице есть образец кода.

person amir    schedule 13.11.2017

Вы можете использовать канал жизненного цикла из SystemChannels.

Пример:

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

Выход:

I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed
person German Saprykin    schedule 13.11.2017
comment
Я чувствовал, что решение амиров более идоматично. Но спасибо за ответ! - person forgemo; 13.11.2017
comment
Это может быть очевидно для других, но мне потребовалось время, чтобы понять, что мне нужно переместить это в место после вызова Flutter runApp. - person edhubbell; 11.07.2018