243 votes

Flutter : comment quitter l'application de manière programmatique ?

Comment puis-je fermer de manière programmatique une application Flutter. J'ai essayé de faire sauter le seul écran mais cela donne un écran noir.

242voto

Hasan A Yousef Points 4851

Ce qui suit a parfaitement fonctionné avec moi dans les deux Android et iOS J'ai utilisé exit(0) de dart: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),
          ), 
    );
  }

MISE À JOUR janvier 2019 La solution préférée est :

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

Comme décrit ici

0 votes

Qui n'a pas t work for me... I J'essaie d'ajouter un bouton de sortie à CupertinoTabScafold. Avec ()=>exit(0), cela donne un écran vide avec une barre d'onglets.

6 votes

Cela fonctionne. Mais Apple interdit les boutons de sortie personnalisés et rejettera probablement l'application si vous en avez un.

0 votes

@HasanAYousef Dans ma solution, j'obtiens le message "Undefined name SystemChannels".

218voto

CopsOnRoad Points 4705

Pour iOS

SystemNavigator.pop() : PAS DE TRAVAIL

exit(0) : Fonctionne mais Apple peut SUSPENDEZ VOTRE APPLICATION parce que c'est contraire aux directives de l'interface humaine d'Apple de quitter l'application de façon programmatique.


Pour Android

SystemNavigator.pop() : Travaux et est le RECOMMANDÉ moyen de quitter l'application.

exit(0) : Fonctionne aussi mais c'est NON RECOMMANDÉ car il met fin au processus Dart VM immédiatement et l'utilisateur peut penser que l'application vient de se planter.

1 votes

On dirait que SystemNavigator.pop() ne fonctionne pas sous l'émulateur Android. L'application fonctionne toujours en arrière-plan. Je ne suis donc pas sûr qu'elle fonctionnera correctement sur un appareil réel.

2 votes

@AleksTi Il quitte simplement l'application, il ne ferme pas le processus VM. Vous pouvez essayer exit(0) pour vos besoins.

0 votes

SystemNavigator.pop() quitte mon application et affiche un message de plantage, exit(0) fonctionne comme prévu

55voto

Collin Jackson Points 29995

Vous pouvez le faire avec SystemNavigator.pop() .

2 votes

Rien ne se passe sur Android et iOS. Utilisation de exit(0); fait le travail

2 votes

Sur iOS, SystemNavigator.pop est ignoré car les directives d'interface humaine d'Apple stipulent que les applications ne doivent pas se fermer d'elles-mêmes. Sous Android, cela devrait fonctionner, et est préféré à l'appel de la commande dart:io La méthode de sortie de l'entreprise. Envisagez de déposer un problème : github.com/flutter/flutter/issues/new

0 votes

Une idée pour iOS, comment pouvons-nous faire dans flutter ?

52voto

Blasanka Points 3456

Les réponses sont déjà fournies, mais ne vous contentez pas de les copier-coller dans votre base de code sans savoir ce que vous faites :

Si vous utilisez SystemChannels.platform.invokeMethod('SystemNavigator.pop'); notez que doc est clairement mentionnée :

Indique au navigateur du système de supprimer cette activité de la pile et de revenir à l'activité précédente.

Sous iOS, les appels à cette méthode sont ignorés car les directives d'interface humaine d'Apple d'Apple stipulent que les applications ne doivent pas se elles-mêmes.

Vous pouvez utiliser exit(0) . Et cela terminera le processus Dart VM immédiatement avec le code de sortie donné. Mais n'oubliez pas que doc dit :

Cette opération n'attend pas la fin d'une opération asynchrone. L'utilisation de exit est donc très susceptible de perdre des données.

De toute façon, le doc a également noté SystemChannels.platform.invokeMethod('SystemNavigator.pop'); :

Cette méthode doit être préférée à l'appel de la méthode exit de dart:io, puisque cette dernière peut faire en sorte que la plate-forme sous-jacente agisse comme si l'application s'était écrasée.

Donc, continuez à vous souvenir de ce que vous faites.

21 votes

Tu as écrit tellement de notes intelligentes mais... qu'est-ce que manière correcte pour sortir programmatiquement de l'application sans suspension potentielle dans iOS comme décrit ci-dessous ?

0 votes

Pourquoi SystemChannels.platform.invokeMethod('SystemNavigator.pop') et non pas simplement SystemNavigator.pop(); ?

1 votes

@CsabaToth les deux sont ok, en utilisant invokeMethod nous appelons directement l'Android natif pop méthode. Au moment où j'écris, il se peut que la méthode des palpitations soit utilisée. pop n'existait pas. Peut-être que le SystemNavigator.pop(); invoque la méthode native pour sortir (Vérifiez le code source de la méthode, je ne l'ai pas vérifié).

24voto

shirsh shukla Points 1711

Vous pouvez appeler cela en vérifiant une condition dépendante de la plateforme. Effectuer une action différente au clic pour Android et ios.

    import 'dart:io' show Platform;
    import 'package:flutter/services.dart';

           RaisedButton(
                onPressed: () {
                  if (Platform.isAndroid) {
                    SystemNavigator.pop();
                  } else if (Platform.isIOS) {
                    exit(0);
                  }
                },
              child: Text("close app"),
            )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X