Flutter cómo salir de la aplicación mediante programación


103

¿Cómo puedo cerrar programáticamente una aplicación Flutter? He intentado abrir la única pantalla, pero resulta en una pantalla negra.

Respuestas:


57

Para iOS

SystemNavigator.pop(): NO FUNCIONA

exit(0): Funciona, pero Apple puede SUSPENDER SU APLICACIÓN porque es contrario a las pautas de la Interfaz humana de Apple salir de la aplicación mediante programación.


Para Android

SystemNavigator.pop(): Funciona y es la forma RECOMENDADA de salir de la aplicación.

exit(0): También funciona, pero NO SE RECOMIENDA ya que finaliza el proceso de Dart VM inmediatamente y el usuario puede pensar que la aplicación acaba de fallar.


1
Parece que SystemNavigator.pop()no funciona con el emulador de Android. La aplicación aún funciona en segundo plano. Así que no estoy seguro de si funcionará correctamente en un dispositivo real.
BambinoUA

2
@AleksTi Simplemente sale de la aplicación, no cierra el proceso de VM. Puede intentar exit(0)por su necesidad.
CopsOnRoad

SystemNavigator.pop()sale de mi aplicación y muestra un mensaje de bloqueo, exit(0)funciona como se esperaba
Shanks

140

A continuación funcionó perfectamente conmigo en ambos Androidy iOS, usé exit(0)dedart: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),
          ), 
    );
  }

ACTUALIZACIÓN Enero de 2019 La solución preferible es:

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

Como se describe aquí


eso no estaba t work for me... Itratando de agregar un botón de salida a CupertinoTabScafold. Con () => exit (0), da una pantalla en blanco con barra de pestañas.
Ricardo BRGWeb

3
Funciona. Pero Apple prohíbe los botones de salida personalizados y probablemente rechazará la aplicación si tiene uno
Dima Rostopira

@HasanAYousef En mi solución, aparece el mensaje Nombre indefinido
SystemChannels

36

Puedes hacer esto con SystemNavigator.pop().


1
No sucede nada tanto en Android como en iOS. Usar exit(0);funciona
Theo Bouwman

2
En iOS, SystemNavigator.popse ignora porque las pautas de interfaz humana de Apple establecen que las aplicaciones no deben salir por sí mismas. En Android, debería funcionar y se prefiere al dart:iométodo de salida de la llamada . Considere presentar un problema: github.com/flutter/flutter/issues/new
Collin Jackson

Alguna idea para iOS, ¿cómo podemos hacer en flutter?
iPatel

@iPatel Puedes usar exit (0) para iOS, eso es todo.
CopsOnRoad

Yo, pero ¿qué pasa con el rechazo? (Como dijiste en el comentario anterior
iPatel

32

Ya se proporcionan respuestas, pero no se limite a copiar y pegarlas en su base de código sin saber lo que está haciendo:

Si usa, SystemChannels.platform.invokeMethod('SystemNavigator.pop');tenga en cuenta que el documento menciona claramente:

Indica al navegador del sistema que elimine esta actividad de la pila y vuelva a la actividad anterior.

En iOS, las llamadas a este método se ignoran porque las pautas de interfaz humana de Apple establecen que las aplicaciones no deben salir por sí mismas.

Puede utilizar exit(0). Y eso terminará el proceso de Dart VM inmediatamente con el código de salida dado. Pero recuerda que el doc dice:

Esto no espera a que finalice ninguna operación asincrónica. Por lo tanto, es muy probable que el uso de exit pierda datos.

De todos modos, el documento también señaló SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

Se debe preferir este método a llamar al método de salida de dart: io, ya que este último puede hacer que la plataforma subyacente actúe como si la aplicación se hubiera bloqueado.

Entonces, recuerda lo que estás haciendo.


10
Escribiste tantas notas inteligentes pero ... ¿cuál es la forma correcta de salir programáticamente de la aplicación sin una posible suspensión en iOS como se describe a continuación?
BambinoUA

4

Prefiero usar

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

Aunque, exit (0) también funciona pero la aplicación se cierra abruptamente y no se ve bien, parece que la aplicación se ha bloqueado.

 Future.delayed(const Duration(milliseconds: 1000), () {
       exit(0);
      });

2

Esto funcionó para mí;

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

A continuación funcionó perfectamente conmigo en la importación de Android e iOS '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()no funciona en iOS, lea mi respuesta. No hay forma de salir en la aplicación de iOS al menos a partir de hoy.
CopsOnRoad
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.