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.
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?
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
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