Jak odrzucić AlertDialog po kliknięciu FlatButton?

87

Mam następujące 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,
                ),
              ],
            ),
        );

Jak mogę zrobić _dismissDialog()zwolnienie powiedział AlertDialog?

Gustash
źródło

Odpowiedzi:

151

Navigator.pop()powinien załatwić sprawę. Możesz również użyć tego, aby zwrócić wynik okna dialogowego (jeśli przedstawiało użytkownikowi opcje wyboru)

Collin Jackson
źródło
10
Dziękuję, zadziałało. Wywołanie Navigator.pop () zamyka okno zgodnie z oczekiwaniami. Mój aktualny onPressed wygląda następująco: onPressed: () => Navigator.pop(context),
Gustash
@Collin, stworzyłem funkcję pokazującą okno dialogowe przez inną funkcję. void showLoader (context) {showDialog (context: context, builder: (kontekst BuildContext) {return Container (width: double.infinity, height: double.infinity, decoration: BoxDecoration (color: Colors.black.withOpacity (0.05),) , child: Center (child: Text ('hello friends'),),);},); } Proszę zasugerować mi, jak mogę ukryć to okno dialogowe. Dzięki.
Kamlesh
U mnie też zadziałało!
Daniel
76
Navigator.of(context, rootNavigator: true).pop('dialog')

pracował ze mną.

AbdulMomen عبدالمؤمن
źródło
5
Zaakceptowana odpowiedź powodowała znikanie całej mojej strony, to jest poprawna odpowiedź, aby ukryć okno dialogowe
user969068
6
to lepsze podejście do zamknięcia okna, próbowałem powyższego rozwiązania, ale wyskoczyło ono z mojego innego widoku.
Farhana
3
Zaakceptowana odpowiedź powodowała również zniknięcie mojej strony, to jest właściwa odpowiedź, aby ukryć okno dialogowe.
Ben
Odpowiedź nadal powoduje wyskakiwanie całego widoku.
karrar kazuya
co to jest rootNavigator?
K Pradeep Kumar Reddy
22
Navigator.pop(_)

działało dla mnie, ale galeria Flutter Team zawiera przykład wykorzystujący:

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

które również działają i kusi mnie, by pójść za ich przykładem.

Bryon Nicoson
źródło
1
Wywołuję Custom AlertDialog z innego pliku .dart i używam Navigator.of (context, rootNavigator: true) .pop (); pracował dzięki.
djalmafreestyler
1
Zawsze korzystałem z pierwszej wersji ... ale właśnie natknąłem się na przykład, w którym była druga, ale pierwsza usunęła ekran poniżej.
William Terrill,
15

Jeśli nie chcesz zwracać żadnego wyniku, użyj jednego z nich:

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

Ale jeśli chcesz zwrócić jakiś wynik, zobacz to

Przykład:

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
źródło
Jaka jest różnica między tymi dwoma wierszami kodu?
K Pradeep Kumar Reddy
@ user3410835 Bez różnicy, w rzeczywistości Navigator.pop()wywołuje pierwszą linię.
CopsOnRoad
Jak sprawić, by AlertDialog odrzuciło = false? Aby okno dialogowe nie było zamykane, gdy klikam ekran poza oknem dialogowym.
K Pradeep Kumar Reddy
@ user3410835 istnieje właściwość o nazwie barrierDismissibleshowDialog (), którą można ustawić na wartość false lub true.
Prabowo Murti
6

Przykład odrzucania okna ostrzeżenia po kliknięciu płaskiego przycisku

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

Powyższy kod ma dwie unikalne rzeczy, które są używane do dostarczania wyniku wywołania zwrotnego w oknie dialogowym

Navigator.of (context) .pop (false) - zwracanie wartości false po naciśnięciu NO Navigator.of (context) .pop (true) - zwracanie wartości true po naciśnięciu YES

Na podstawie tych zwracanych wartości możemy wykonać pewne operacje poza nim lub zachować wartość statusu dialogu

jitsm555
źródło
co zrobi pop (false)? i co zrobi pop (true)? W każdym razie w obu przypadkach chcemy, aby AlertDialog został odrzucony.
K Pradeep Kumar Reddy
@ user3410835: Zmodyfikowano kod, proszę spojrzeć
jitsm555
4

To działa doskonale

      RaisedButton(
                child: Text(
                  "Cancel",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
                onPressed: () => Navigator.pop(context),
              ),
Daya Nithi
źródło
2

Możesz zawinąć swój AlertDialog w metodę asynchroniczną, aby wszystko było czyste.

  _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
źródło
1

Posługiwać się Navigator.pop(context);

Przykład

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);
                    },
                ),
              ],
            ),
        );
Szybki uczeń
źródło
1

Navigator.of(dialogContext).pop() w przeciwnym razie możesz zamknąć stronę, jeśli przechodzisz ze strony głównej do strony szczegółów

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

Ta odpowiedź działa, jeśli chcesz otworzyć okno dialogowe i przejść do innego widoku. Ta część „ current_user_location” jest ciągiem, do którego router musi wiedzieć, do którego widoku ma przejść.

FlatButton(
           child: Text('NO'),
           onPressed: () {
             Navigator.popAndPushNamed(context, 'current_user_location');
              },
           ),
Princeps Polycap
źródło
0

Pomogłoby utworzenie oddzielnego kontekstu dla okna dialogowego alertów.

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
źródło
0

Użyj poniższego kodu, aby zamknąć okno dialogowe

RaisedButton(
     onPressed: () { Navigator.of(context).pop();},
     child: Text("Close",style: TextStyle(color: Colors.white), ),
                color: Colors.black,
           )
Krishnamoorthy Acharya
źródło
0

przekazać go w showDialog barrierDismissible : true

ciekawski
źródło
0

To zadziałało dla mnie Navigator.of (context, rootNavigator: true) .pop ('dialog').

Navigator.pop () po prostu zamyka bieżącą stronę / ekran.

Książę Kelvin
źródło
0

Ogólnie Navigator.pop(context);działa.

Ale jeśli aplikacja ma wiele obiektów Navigatora i dialogBoxnie zamyka się, spróbuj tego

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

Jeśli chcesz przekazać wynik, spróbuj

Navigator.pop(context,result);

LUB

Navigator.of(context, rootNavigator: true).pop(result)
Vicky Salunkhe
źródło
-3

Zaakceptowana odpowiedź określa, jak zamknąć okno dialogowe za pomocą klasy Navigator. Aby zamknąć okno dialogowe bez używania Nawigatora, możesz ustawić zdarzenie onPressed przycisku na:

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

W przypadku, gdy powyższy kod nie jest oczywisty, w zasadzie ustawia Parent AlertDialog FlatButton na wartość null, a tym samym go odrzuca.

otboss
źródło