Flattern, wie man die App programmgesteuert beendet

96

Wie kann ich eine Flutter-Anwendung programmgesteuert schließen? Ich habe versucht, den einzigen Bildschirm zu öffnen, aber das führt zu einem schwarzen Bildschirm.

Theo Bouwman
quelle

Antworten:

46

Für iOS

SystemNavigator.pop(): FUNKTIONIERT NICHT

exit(0): Funktioniert, aber Apple kann Ihre App aussetzen, da es gegen die Richtlinien von Apple Human Interface verstößt , die App programmgesteuert zu beenden .


Für Android

SystemNavigator.pop(): Funktioniert und ist die EMPFOHLENE Methode zum Beenden der App.

exit(0): Funktioniert auch, wird jedoch NICHT EMPFOHLEN, da der Dart VM-Prozess sofort beendet wird und der Benutzer möglicherweise denkt, dass die App gerade abgestürzt ist.

CopsOnRoad
quelle
1
Es sieht so aus, als ob SystemNavigator.pop()es unter dem Android-Emulator nicht funktioniert. Die App arbeitet immer noch im Hintergrund. Ich bin mir also nicht sicher, ob es auf einem echten Gerät richtig funktioniert.
AleksTi
1
@AleksTi Es beendet einfach die App, es schließt den VM-Prozess nicht. Sie können exit(0)für Ihre Bedürfnisse versuchen .
CopsOnRoad
129

Unten funktionierte perfekt mit mir in beiden Androidund iOSich habe exit(0)von verwendetdart:io

import 'dart:io';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new ... (...),
          floatingActionButton: new FloatingActionButton(
            onPressed: ()=> exit(0),
            tooltip: 'Close app',
            child: new Icon(Icons.close),
          ), 
    );
  }

UPDATE Jan 2019 Bevorzugte Lösung ist:

SystemChannels.platform.invokeMethod('SystemNavigator.pop');

Wie hier beschrieben

Hasan A Yousef
quelle
Das hat nicht t work for me... Iversucht, CupertinoTabScafold eine Exit-Schaltfläche hinzuzufügen. Mit () => exit (0) wird ein leerer Bildschirm mit Registerkarten angezeigt.
Ricardo BRGWeb
3
Es klappt. Aber Apple verbietet benutzerdefinierte Exit-Schaltflächen und wird wahrscheinlich App ablehnen, wenn Sie eine haben
Dima Rostopira
@ HasanAYousef In meiner Lösung Nachricht erhalten Undefinierter Name SystemChannels
user_odoo
34

Sie können dies mit tun SystemNavigator.pop().

Collin Jackson
quelle
1
Auf Android und iOS passiert nichts. Verwenden exit(0);funktioniert
Theo Bouwman
2
Unter iOS SystemNavigator.popwird ignoriert, da die Richtlinien für die Benutzeroberfläche von Apple besagen, dass Anwendungen sich nicht selbst beenden sollten. Unter Android sollte es funktionieren und wird der dart:ioExit-Methode des Aufrufs vorgezogen . Erwägen Sie, ein Problem einzureichen
Collin Jackson
Irgendeine Idee für iOS, wie können wir im Flattern tun?
iPatel
@iPatel Sie können exit (0) für iOS verwenden, fertig.
CopsOnRoad
Yo, aber was ist mit Ablehnung; (wie Sie im obigen Kommentar gesagt haben
iPatel
27

Die Antworten sind bereits vorhanden, aber bitte kopieren Sie diese nicht einfach und fügen Sie sie in Ihre Codebasis ein, ohne zu wissen, was Sie tun:

Wenn Sie den SystemChannels.platform.invokeMethod('SystemNavigator.pop');Hinweis verwenden , dass das Dokument deutlich erwähnt:

Weist den Systemnavigator an, diese Aktivität vom Stapel zu entfernen und zur vorherigen Aktivität zurückzukehren.

Unter iOS werden Aufrufe dieser Methode ignoriert, da die Richtlinien für die Benutzeroberfläche von Apple besagen, dass Anwendungen sich nicht selbst beenden sollten.

Sie können verwenden exit(0). Dadurch wird der Dart VM-Prozess sofort mit dem angegebenen Exit-Code beendet. Aber denken Sie daran, dass der Arzt sagt:

Dies wartet nicht darauf, dass asynchrone Vorgänge beendet werden. Die Verwendung von exit führt daher sehr wahrscheinlich zu Datenverlust.

Wie auch immer, der Arzt hat auch bemerkt SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

Diese Methode sollte dem Aufruf der Exit-Methode von dart: io vorgezogen werden, da letztere dazu führen kann, dass sich die zugrunde liegende Plattform so verhält, als wäre die Anwendung abgestürzt.

Denken Sie also daran, was Sie tun.

Blasanka
quelle
8
Sie schrieb so viele kluge Noten aber ... was die richtige Art und Weise programmatisch verlassen App ohne mögliche Aussetzung in iOS , wie unten beschrieben?
AleksTi
2

Das hat bei mir funktioniert;

import 'dart:io';

@override
Widget build(BuildContext context) {
  return new Scaffold(
    appBar: new AppBar(
      title: new Text(widget.title),
    ),
    body: new ... (...),
      floatingActionButton: new FloatingActionButton(
        onPressed: ()=> exit(0),
        tooltip: 'Close app',
        child: new Icon(Icons.close),
      ), 
  );
}
Ihr Mann
quelle
1

Ich benutze lieber

 Future.delayed(const Duration(milliseconds: 1000), () {
        SystemChannels.platform.invokeMethod('SystemNavigator.pop');
      });

Exit (0) funktioniert zwar auch, aber die App wird abrupt geschlossen und sieht nicht gut aus. Es scheint, dass die App abgestürzt ist.

 Future.delayed(const Duration(milliseconds: 1000), () {
       exit(0);
      });
Ayan Bhattacharjee
quelle
-1

Unten funktionierte perfekt mit mir sowohl im Android- als auch im iOS-Import 'dart: io';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new ... (...),
          floatingActionButton: new FloatingActionButton(
            onPressed: ()=> SystemNavigator.pop(),
            tooltip: 'Close app',
            child: new Icon(Icons.close),
          ), 
    );
  }
Ahmed Raza
quelle
1
SystemNavigator.pop()funktioniert nicht in iOS, bitte lesen Sie meine Antwort. Zumindest ab heute gibt es keine Möglichkeit, die iOS-App zu beenden.
CopsOnRoad