Flutter - фоновая служба в Dart (только когда приложение отображается)

Мне нужна фоновая служба во флаттере, которая очень быстро превращает http.get (...)

Эта служба должна работать в фоновом режиме, пока приложение работает. Если приложение закрыто, фоновая служба также должна остановиться. Когда приложение запускается, фоновая служба также должна запуститься.

Я могу найти только пакеты, которые предоставляют фоновую службу, которая также запускается, когда приложение закрыто - как в этом примере: https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124

Может, то, что я ищу, не называется "фоновая служба"?

Вот код, который я хочу запустить в этой фоновой службе / задаче ...

Timer.periodic(Duration(seconds: 60), (Timer t) => checkForUpdates());    

person max    schedule 20.05.2019    source источник
comment
поэтому вам вообще не нужна никакая служба, если она должна запускаться только тогда, когда ваше приложение активно   -  person pskink    schedule 21.05.2019
comment
Как бы вы тогда это сделали? Просто напишите асинхронную функцию, вызываемую в каждом init () виджета?   -  person max    schedule 21.05.2019
comment
вы пробовали Timer.periodic, не работает?   -  person pskink    schedule 21.05.2019
comment
Не пробовал, подумал, что это будет неправильный подход. Попробую это и дам вам знать   -  person max    schedule 21.05.2019
comment
Я только что протестировал, и он работает. Как ни странно, служба продолжает работать несколько минут, даже если приложение не отображается. Теперь я бы запускал службу каждый раз в init () и закрывал ее в dispose () в каждом виджете. Но разве нет глобальной возможности   -  person max    schedule 22.05.2019
comment
но вам не нужна эта услуга, вы можете использовать только Timer.periodic   -  person pskink    schedule 22.05.2019


Ответы (1)


Я столкнулся с той же проблемой. Timer.periodic продолжает работать в фоновом режиме в течение неконтролируемого времени после выхода из приложения. Мое решение выглядит примерно так:

class CollectStampsState extends State<CollectStamps> with WidgetsBindingObserver { 
    Timer timer;

    ...

    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
        if (state != AppLifecycleState.resumed) {
            timer.cancel();
        } else {
        if (!timer.isActive) {
            timer = Timer.periodic(Duration(seconds: 30), (Timer t) => yourFunction());
        }
    }

    @override
    void initState() {
        super.initState();
        timer = Timer.periodic(Duration(seconds: 30), (Timer t) => yourFunction());
        WidgetsBinding.instance.addObserver(this);
    }

    @override
    void dispose() {
        timer?.cancel();
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
    }

     @override
     Widget build(BuildContext context) {
        ... 
     }
}

Вы также можете сохранить AppLifecycleState, если хотите использовать его в других местах, или изменить поведение для разных AppLifecycleStates. Но в этом случае таймер активен только тогда, когда приложение находится на переднем плане. Как только он находится в фоновом режиме, таймер отменяется.

person dirkbo    schedule 26.07.2019