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.

Theo Bouwman
fuente

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.

CopsOnRoad
fuente
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í

Hasan A Yousef
fuente
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().

Collin Jackson
fuente
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.

Blasanka
fuente
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);
      });
Ayan Bhattacharjee
fuente
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),
      ), 
  );
}
Germán
fuente
-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),
          ), 
    );
  }
Ahmed Raza
fuente
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