Wie kann ich einen AlertDialog bei einem FlatButton-Klick schließen?

82

Ich habe folgendes 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,
                ),
              ],
            ),
        );

Wie kann ich _dismissDialog()entlassen sagen AlertDialog?

Gustash
quelle

Antworten:

137

Navigator.pop()sollte den Trick machen. Sie können dies auch verwenden, um das Ergebnis des Dialogfelds zurückzugeben (sofern dem Benutzer Auswahlmöglichkeiten angezeigt wurden).

Collin Jackson
quelle
9
Danke, das hat funktioniert. Durch Aufrufen von Navigator.pop () wird der Dialog wie erwartet geschlossen. Mein aktuelles onPressed ist wie folgt: onPressed: () => Navigator.pop(context),
Gustash
@Collin, ich habe eine Funktion erstellt, um das Dialogfeld von einer anderen Funktion anzuzeigen. void showLoader (Kontext) {showDialog (Kontext: Kontext, Builder: (BuildContext-Kontext) {Rückgabecontainer (Breite: double.infinity, Höhe: double.infinity, Dekoration: BoxDecoration (Farbe: Colors.black.withOpacity (0.05),) , child: Center (child: Text ('Hallo Freunde'),),);},); } Bitte schlagen Sie mir vor, wie ich diesen Showdialog ausblenden kann. Vielen Dank.
Kamlesh
63
Navigator.of(context, rootNavigator: true).pop('dialog')

arbeitete mit mir.

AbdulMomen عبدالمؤمن
quelle
5
Die akzeptierte Antwort führte dazu, dass meine gesamte Seite verschwand. Dies ist die richtige Antwort, um einen Dialog
auszublenden
5
Es ist ein besserer Ansatz, um den Dialog zu schließen. Ich habe die obige Lösung ausprobiert, aber meine andere Ansicht wurde geöffnet.
Farhana
3
Die akzeptierte Antwort hat dazu geführt, dass meine Seite ebenfalls verschwunden ist. Dies ist die richtige Antwort, um einen Dialog auszublenden.
Ben
Die Antwort bewirkt immer noch, dass die gesamte Ansicht angezeigt wird.
karrar kazuya
Was ist rootNavigator?
K Pradeep Kumar Reddy
20
Navigator.pop(_)

hat für mich gearbeitet, aber die Galerie des Flutter-Teams enthält ein Beispiel mit:

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

Das funktioniert auch, und ich bin versucht, ihrem Beispiel zu folgen.

Bryon Nicoson
quelle
1
Ich rufe einen benutzerdefinierten AlertDialog aus einer anderen .dart-Datei auf und verwende Navigator.of (Kontext, rootNavigator: true) .pop (); funktionierte danke.
Djalmafreestyler
1
Ich hatte immer die erste Version verwendet ... aber ich bin nur auf ein Beispiel gestoßen, wo die zweite es tat, aber die erste entfernte den Bildschirm darunter.
William Terrill
15

Wenn Sie kein Ergebnis zurückgeben möchten, verwenden Sie eines der folgenden Elemente:

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

Wenn Sie jedoch ein Ergebnis zurückgeben möchten, lesen Sie dies

Beispiel:

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
quelle
Was ist der Unterschied zwischen diesen beiden Codezeilen?
K Pradeep Kumar Reddy
@ user3410835 Kein Unterschied, Navigator.pop()ruft eigentlich die erste Zeile auf.
CopsOnRoad
Wie mache ich AlertDialog entlassbar = false? Damit der Dialog nicht geschlossen wird, wenn ich auf den Bildschirm außerhalb des Dialogs klicke.
K Pradeep Kumar Reddy
@ user3410835 Es gibt eine Eigenschaft mit dem Namen barrierDismissibleshowDialog (), die Sie auf false oder true setzen können.
Prabowo Murti
5

Beispiel für das Schließen des Alarmdialogs beim Klicken auf eine flache Schaltfläche

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'),
      ),

Der obige Code enthält zwei eindeutige Elemente, die verwendet werden, um das Rückrufergebnis des Dialogs bereitzustellen

Navigator.of (Kontext) .pop (false) - Gibt einen falschen Wert zurück, wenn wir NO drücken. Navigator.of (Kontext) .pop (true) - Gibt einen True-Wert zurück, wenn wir YES drücken

Basierend auf diesen Rückgabewerten können wir einige Operationen außerhalb davon ausführen oder den Dialogstatuswert beibehalten

jitsm555
quelle
Was wird Pop (false) tun? und was wird pop (true) tun? In beiden Fällen möchten wir jedenfalls, dass der AlertDialog geschlossen wird.
K Pradeep Kumar Reddy
@ user3410835: Den Code geändert, bitte schauen Sie mal
jitsm555
4

Das funktioniert perfekt

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

Sie können Ihren AlertDialog in eine asynchrone Methode einbinden, um die Dinge sauber zu machen.

  _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
quelle
1

Verwenden Navigator.pop(context);

Beispiel

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);
                    },
                ),
              ],
            ),
        );
Schneller Lerner
quelle
1

Navigator.of(dialogContext).pop() Andernfalls können Sie die Seite schließen, wenn Sie von der Master- zur Detailseite navigiert sind

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

Diese Antwort funktioniert, wenn Sie den Dialog öffnen und zu einer anderen Ansicht navigieren möchten. Dieser Teil ' current_user_location' ist die Zeichenfolge, zu der der Router wissen muss, zu welcher Ansicht er navigieren soll.

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

Das Erstellen eines separaten Kontexts für den Warnungsdialog würde helfen.

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
quelle
0

Bitte verwenden Sie den folgenden Code, um den Dialog zu schließen

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

Übergebe es im showDialog barrierDismissible : true

Neugieriger
quelle
0

Dies funktionierte für mich Navigator.of (Kontext, rootNavigator: true) .pop ('dialog').

Navigator.pop () schließt nur die aktuelle Seite / den aktuellen Bildschirm.

Prinz Kelvin
quelle
-3

In der akzeptierten Antwort wird angegeben, wie ein Dialogfeld mithilfe der Navigator-Klasse geschlossen werden soll. Um einen Dialog ohne Verwendung von Navigator zu schließen, können Sie das Ereignis onPressed der Schaltfläche auf Folgendes einstellen:

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

Falls der obige Code nicht selbsterklärend ist, wird der übergeordnete AlertDialog des FlatButton grundsätzlich auf null gesetzt und somit verworfen.

otboss
quelle