2017-11-12 4 views
2

Ich bin neu in Dart/Flutter und möchte eine einfache App erstellen, in der eine LinearProgressBar jede Sekunde aktualisiert wird.Wie onPause/onResume in Flutter App zu behandeln?

Ohne zu viel in den eigentlichen Code zu bekommen, habe ich die folgende Einrichtung funktioniert.

  • Eine Funktion, die den Fortschritt basierend auf der verstrichenen Zeit berechnet.
  • Eine LinearProgressBar, die den Fortschritt anzeigt.
  • Ein periodischer Timer, der den Fortschritt neu berechnet und den Fortschrittsbalken jede Sekunde aktualisiert.
  • Ich debugprint 'Tick' jedes Mal, die Neuberechnung ist abgeschlossen.

Alles funktioniert wie erwartet mit einer Ausnahme. Das Häkchen wird immer ausgedruckt, wenn ich die App im Hintergrund auf meinem Android-Gerät verschiebe.

Auf nativem Android würde ich meinen periodischen Timer abbrechen, wenn das Ereignis 'onPause' ausgelöst wird.

Gibt es etwas Ähnliches in Flutter? Alles, was ich finden konnte, war "initState" und "dispose". Dispose wird jedoch nicht aufgerufen, wenn die App in den Hintergrund verschoben wird.

Ich möchte nicht, dass der Timer im Hintergrund tickt.

Auf meiner Suche fand ich diese Stack Overflow Frage onresume-and-onpause-for-widgets-on-flutter. Es ist Antwort schlägt vor, TickerProviderStateMixin zu verwenden.

Ich habe es folgendermaßen verwendet.

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 

} 

Es funktioniert, aber ich bin immer noch nicht zufrieden.

Der Grund ist, dass der Ticker-Callback nun alle paar Millisekunden statt einmal pro Sekunde aufgerufen wird. Das scheint mir eine Verschwendung von Ressourcen zu sein (ich brauche keine sanfte Animation), ... übertreibe ich Dinge?

Auch wenn es scheint, dass ich es nicht für meinen Anwendungsfall würde ich noch gerne wissen:

Wie die onPause/onResume Ereignisse auf eigene Faust behandeln?

Antwort

3

Sie können die didChangeAppLifecycleState der WidgetBindingObserver Schnittstelle außer Kraft setzen Benachrichtigungen für App Lifecycle Änderungen zu erhalten.

Es gibt Beispielcode in this page

0

Sie können lifecycle Kanal von SystemChannels verwenden.

Beispiel:

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

Ausgang:

I/flutter (3672): SystemChannels> AppLifecycleState.paused 
I/flutter (3672): SystemChannels> AppLifecycleState.resumed 
+0

Ich fühlte, dass Emire Lösung mehr idomatic ist. Danke für die Antwort! – forgemo

Verwandte Themen