¿Cómo descartar un AlertDialog en un clic FlatButton?

82

Tengo lo siguiente AlertDialog.

showDialog(
            context: context,
            child: new AlertDialog(
              title: const Text("Location disabled"),
              content: const Text(
                  """
Location is disabled on this device. Please enable it and try again.
                  """),
              actions: [
                new FlatButton(
                  child: const Text("Ok"),
                  onPressed: _dismissDialog,
                ),
              ],
            ),
        );

¿Cómo puedo hacer que se _dismissDialog()despida dicho AlertDialog?

Gustash
fuente

Respuestas:

137

Navigator.pop()debería hacer el truco. También puede usar eso para devolver el resultado del cuadro de diálogo (si le presentó al usuario opciones)

Collin Jackson
fuente
9
Gracias, eso funcionó. Llamar a Navigator.pop () cierra el diálogo como se esperaba. Mi onPressed actual es el siguiente: onPressed: () => Navigator.pop(context),
Gustash
@ Collin, he creado una función para mostrar el cuadro de diálogo mediante otra función. void showLoader (context) {showDialog (context: context, builder: (BuildContext context) {return Container (width: double.infinity, height: double.infinity, decoration: BoxDecoration (color: Colors.black.withOpacity (0.05),) , niño: Centro (niño: Texto ('hola amigos'),),);},); } Por favor sugiera cómo puedo ocultar este programa de diálogo. Gracias.
Kamlesh
63
Navigator.of(context, rootNavigator: true).pop('dialog')

trabajó conmigo.

AbdulMomen عبدالمؤمن
fuente
5
La respuesta aceptada estaba haciendo que toda mi página desapareciera, esta es la respuesta adecuada para ocultar un diálogo
user969068
5
es un mejor enfoque para cerrar el cuadro de diálogo, estaba probando la solución anterior pero aparecía en mi otra vista.
Farhana
3
La respuesta aceptada estaba haciendo que mi página también desapareciera, esta es la respuesta adecuada para ocultar un diálogo.
Ben
La respuesta aún hace que aparezca toda la vista.
karrar kazuya
¿Qué es rootNavigator?
K Pradeep Kumar Reddy
20
Navigator.pop(_)

funcionó para mí, pero la galería del equipo Flutter contiene un ejemplo que usa:

Navigator.of(context, rootNavigator: true).pop()

que también funciona, y me siento tentado a seguir su ejemplo.

Bryon Nicoson
fuente
1
Llamo a un Custom AlertDialog desde otro archivo .dart y uso Navigator.of (context, rootNavigator: true) .pop (); trabajado gracias.
djalmafreestyler
1
Siempre había usado la primera versión ... pero me encontré con un ejemplo donde lo hizo la segunda, pero la primera eliminó la pantalla debajo de ella.
William Terrill
15

Si no desea devolver ningún resultado, use cualquiera de ellos:

Navigator.of(context).pop();
Navigator.pop(context);

Pero si desea devolver algún resultado, consulte este

Ejemplo:

showDialog(
    context: context,
    builder: (_) {
      return AlertDialog(
        title: Text('Wanna Exit?'),
        actions: [
          FlatButton(
            onPressed: () => Navigator.pop(context, false), // passing false
            child: Text('No'),
          ),
          FlatButton(
            onPressed: () => Navigator.pop(context, true), // passing true
            child: Text('Yes'),
          ),
        ],
      );
    }).then((exit) {
  if (exit == null) return;

  if (exit) {
    // user pressed Yes button
  } else {
    // user pressed No button
  }
});
CopsOnRoad
fuente
¿Cuál es la diferencia entre estas dos líneas de código?
K Pradeep Kumar Reddy
@ user3410835 No hay diferencia, en realidad Navigator.pop()llama a la primera línea.
CopsOnRoad
¿Cómo hacer que AlertDialog sea descartable = falso? Para que el cuadro de diálogo no se descarte cuando hago clic en la pantalla fuera del cuadro de diálogo.
K Pradeep Kumar Reddy
@ user3410835 hay una propiedad con el nombre barrierDismissiblede showDialog () y puede establecerla en falso o verdadero.
Prabowo Murti
5

Ejemplo de cierre de diálogo de alerta al hacer clic en un botón plano

RaisedButton(
        onPressed: () {
          showDialog(
              context: context,
              builder: (context) => AlertDialog(
                    title: Text('Are you sure?'),
                    content: Text('Do you want to remove item?'),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop(false),//  We can return any object from here
                           child: Text('NO')),
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop(true), //  We can return any object from here
                          child: Text('YES'))
                    ],
                  )).then((value) =>
              print('Selected Alert Option: ' + value.toString()));
        },
        child: Text('Show Alert Dialog'),
      ),

El código anterior tiene dos cosas únicas que se utilizan para proporcionar el resultado de devolución de llamada del diálogo

Navigator.of (context) .pop (false) - devuelve un valor falso cuando presionamos NO Navigator.of (context) .pop (true) - devuelve un valor verdadero cuando presionamos YES

Según estos valores de retorno, podemos realizar alguna operación fuera de él o mantener el valor de estado del diálogo

jitsm555
fuente
¿Qué hará estallar (falso)? ¿Y qué hará el pop (verdadero)? De todos modos, en ambos casos, queremos que AlertDialog sea descartado.
K Pradeep Kumar Reddy
@ user3410835: Modificado el código, por favor échale un vistazo
jitsm555
4

Esto funciona perfectamente

      RaisedButton(
                child: Text(
                  "Cancel",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
                onPressed: () => Navigator.pop(context),
              ),
Daya Nithi
fuente
2

Puede envolver su AlertDialog en un método asincrónico para limpiar las cosas.

  _showAlertConfirmDelete() async {
    // the response will store the .pop value (it can be any object you want)
    var response = await showDialog(
        context: context,
        builder: (context) => AlertDialog(
              title: Text('Warn'),
              content: Text('Really wants to remove the record?'),
              actions: <Widget>[
                FlatButton(
                    onPressed: () => Navigator.of(context)
                        .pop(false), 
                    child: Text('No')),
                FlatButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: Text('Yes'))
              ],
            ));
    // do you want to do with the response.
    print(response);
  }
Cassio Seffrin
fuente
1

Utilizar Navigator.pop(context);

Ejemplo

showDialog(
            context: context,
            child: new AlertDialog(
              title: const Text("Location disabled"),
              content: const Text(
                  """
Location is disabled on this device. Please enable it and try again.
                  """),
              actions: [
                new FlatButton(
                  child: const Text("Ok"),
                  onPressed: () {
                      Navigator.pop(context);
                    },
                ),
              ],
            ),
        );
Aprende rápido
fuente
1

Navigator.of(dialogContext).pop() de lo contrario, puede cerrar la página si navegó desde la página principal a la página de detalles

                showDialog(
                  context: context,
                  builder: (dialogContext) {
                    return Dialog(
                      child: Column(
                        children: [
                          Text("Content"),
                          RaisedButton(
                            onPressed: () => Navigator.of(dialogContext).pop(),
                            child: Text("Close"),
                          )
                        ],
                      ),
                    );
                  },
                );
Sultanmyrza Kasymbekov
fuente
0

Esta respuesta funciona si desea abrir el cuadro de diálogo y navegar a otra vista. Esta parte ' current_user_location' es la cadena que el enrutador necesita saber a qué vista navegar.

FlatButton(
           child: Text('NO'),
           onPressed: () {
             Navigator.popAndPushNamed(context, 'current_user_location');
              },
           ),
Princeps Polycap
fuente
0

Sería útil crear un contexto separado para Alert Dialog.

showDialog(
  context: context,
  builder: (alertContext) => AlertDialog(
    title: const Text("Location disabled"),
    content: const Text(
        """Location is disabled on this device. Please enable it and try again."""),
    actions: [
      new FlatButton(
        child: const Text("Ok"),
        onPressed: () => Navigator.pop(alertContext),
      ),
    ],
  ),
);
KushalR
fuente
0

Utilice lo siguiente para el código para cerrar el diálogo

RaisedButton(
     onPressed: () { Navigator.of(context).pop();},
     child: Text("Close",style: TextStyle(color: Colors.white), ),
                color: Colors.black,
           )
Krishnamoorthy Acharya
fuente
0

pásalo en el showDialog barrierDismissible : true

mente curiosa
fuente
0

Esto funcionó para mí Navigator.of (context, rootNavigator: true) .pop ('dialog').

Navigator.pop () simplemente cierra la página / pantalla actual.

Príncipe Kelvin
fuente
-3

La respuesta aceptada indica cómo descartar un diálogo usando la clase Navigator. Para cerrar un cuadro de diálogo sin usar el navegador, puede configurar el evento onPressed del botón en lo siguiente:

setState((){
  thisAlertDialog = null; 
});

En caso de que el código anterior no se explique por sí mismo, básicamente está configurando el Parent AlertDialog del FlatButton en nulo, descartándolo.

otboss
fuente