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.

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.


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


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().


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.


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),
      ), 
  );
}

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);
      });

-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),
          ), 
    );
  }

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.