Як відхилити AlertDialog після натискання кнопки FlatButton?


88

У мене таке 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,
                ),
              ],
            ),
        );

Як я можу змусити _dismissDialog()відмовитись AlertDialog?

Відповіді:


152

Navigator.pop()повинен зробити трюк. Ви також можете використовувати це, щоб повернути результат діалогового вікна (якщо воно надало користувачеві можливість вибору)


10
Дякую, це спрацювало. Виклик Navigator.pop () закриває діалогове вікно, як очікувалося. Мій поточний випуск на Press: onPressed: () => Navigator.pop(context),
Густаш,

@Collin, я створив функцію для відображення діалогового вікна іншою функцією. 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),) , дитина: Центр (дитина: Текст ('привіт друзі'),),);},); } Будь ласка, підкажіть мені, як я можу приховати цей діалог. Дякую.
Камлеш

Працював і у мене!
Даніель

77
Navigator.of(context, rootNavigator: true).pop('dialog')

працював зі мною.


5
Прийнята відповідь спричинила зникнення всієї моєї сторінки, це правильна відповідь, щоб приховати діалогове вікно
user969068

6
це кращий підхід, щоб закрити діалогове вікно, я намагався навести вище рішення, але це створило мою іншу думку.
Фархана

3
Прийнята відповідь спричинила зникнення моєї сторінки, це правильна відповідь, щоб приховати діалогове вікно.
Бен

Відповідь все ще викликає спливаюче уявлення.
karrar kazuya

що таке rootNavigator?
K Pradeep Kumar Reddy

22
Navigator.pop(_)

працював у мене, але галерея команди Flutter містить приклад використання:

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

що також працює, і я маю спокусу наслідувати їхній приклад.


1
Я викликаю спеціальний AlertDialog з іншого файлу .dart і використовую Navigator.of (context, rootNavigator: true) .pop (); працював завдяки.
djalmafreestyler

1
Я завжди використовував першу версію ... але просто натрапив на приклад, коли це робила друга, але перша видалила екран під нею.
Вільям Террілл,

15

Якщо ви не хочете повертати жодного результату, використовуйте будь-який з них:

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

Але якщо ви хочете повернути якийсь результат, перегляньте це

Приклад:

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
  }
});

Яка різниця між цими двома рядками коду ??
K Pradeep Kumar Reddy

@ user3410835 Без різниці, насправді Navigator.pop()викликає перший рядок.
CopsOnRoad

Як зробити AlertDialog відхиляючим = false? Так що діалогове вікно не відхиляється, коли я натискаю на екран поза діалоговим вікном.
K Pradeep Kumar Reddy

@ user3410835 є властивість з іменем barrierDismissibleshowDialog (), і ви можете встановити для неї значення false або true.
Prabowo Murti

6

Приклад закриття діалогового вікна попередження при натисканні на плоску кнопку

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

У наведеному вище коді є дві унікальні речі, які використовуються для отримання результату зворотного виклику діалогу

Navigator.of (context) .pop (false) - повертає помилкове значення, коли ми натискали NO Navigator.of (context) .pop (true) - повертає істинне значення, коли ми натискали YES

На основі цих повернутих значень ми можемо виконати якусь операцію поза ним або зберегти значення стану діалогового вікна


що буде робити pop (false)? а що робитиме поп (правда)? У будь-якому випадку в обох випадках ми хочемо, щоб AlertDialog було відхилено.
K Pradeep Kumar Reddy

@ user3410835: Змінив код, подивіться
jitsm555

4

Це працює Префектно

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

2

Ви можете обернути ваш AlertDialog асинхронним методом, щоб зробити речі чистими.

  _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);
  }

1

Використовуйте Navigator.pop(context);

Приклад

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);
                    },
                ),
              ],
            ),
        );

1

Navigator.of(dialogContext).pop() інакше ви можете закрити сторінку, якщо переходили від Master до сторінки Detail

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

1

Загалом Navigator.pop(context);працює.

Але якщо програма має кілька об’єктів Навігатора і dialogBoxне закривається, спробуйте це

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

Якщо ви хочете передати результат дзвінка, спробуйте

Navigator.pop(context,result);

АБО

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

0

Ця відповідь працює, якщо ви хочете відкрити діалогове вікно та перейти до іншого подання. Ця частина ' current_user_location' - це рядок, який маршрутизатор повинен знати, до якого вікна перейти.

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

0

Створення окремого контексту для діалогового вікна сповіщення допомогло б.

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

0

Будь ласка, використовуйте наступне для коду, щоб закрити діалогове вікно

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


0

Це спрацювало для мене Navigator.of (context, rootNavigator: true) .pop ('dialog').

Navigator.pop () просто закриває поточну сторінку / екран.


-3

У прийнятій відповіді зазначено, як закрити діалогове вікно за допомогою класу Navigator. Щоб закрити діалогове вікно без використання Навігатора, ви можете встановити для події onPress кнопки наступне:

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

Якщо наведений вище код не є зрозумілим, він в основному встановлює для Parent AlertDialog FlatButton значення NULL, тим самим відхиляючи його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.