web-dev-qa-db-fra.com

Comment gérer onPause / onResume dans Flutter App?

Je suis nouveau sur Dart/Flutter et je voudrais créer une application simple où un LinearProgressBar est mis à jour chaque seconde.

Sans entrer trop dans le code réel, j'ai la configuration suivante qui fonctionne.

  • Une fonction qui calcule la progression, en fonction du temps écoulé.
  • Un LinearProgressBar montrant la progression.
  • Un temporisateur périodique recalculant la progression et mettant à jour la barre de progression chaque seconde.
  • Je debugprint 'tick' à chaque fois, le recalcul est terminé.

Tout fonctionne comme prévu, à une exception près. La "coche" continue de s'imprimer lorsque je déplace l'application en arrière-plan sur mon Android.

Sur Android natif, j'annulais mon temporisateur périodique lorsque l'événement "onPause" était déclenché.

Y a-t-il quelque chose de similaire dans Flutter? Tout ce que j'ai pu trouver était "initState" et "dispose". Dispose, cependant, n'est pas appelé lors du déplacement de l'application en arrière-plan.

Je ne veux pas que la minuterie continue de tourner en arrière-plan.

Sur mes recherches, j'ai trouvé cette question de débordement de pile onresume-and-onpause-for-widgets-on-flutter . Sa réponse suggère d'utiliser TickerProviderStateMixin .

Je l'ai utilisé de la manière suivante.

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

}

Cela fonctionne, mais je ne suis toujours pas satisfait.

La raison en est que le rappel du ticker est maintenant appelé toutes les quelques millisecondes au lieu d'une fois par seconde. Cela me semble être un gaspillage de ressources (je n'ai pas besoin d'une animation fluide), ... suis-je en train de trop compliquer les choses?

Même s'il semble que je n'en ai pas besoin pour mon cas d'utilisation, je voudrais quand même savoir:

Comment gérer les événements onPause/onResume par moi-même?

14
forgemo

Vous pouvez remplacer le didChangeAppLifecycleState de l'interface WidgetBindingObserver pour recevoir des notifications pour les modifications du cycle de vie de l'application .

Il y a un exemple de code dans cette page

15
amir

Vous pouvez utiliser cycle de vie canal de SystemChannels .

Exemple:

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

Production:

I/flutter ( 3672): SystemChannels> AppLifecycleState.paused
I/flutter ( 3672): SystemChannels> AppLifecycleState.resumed
9
German Saprykin