Как отклонить AlertDialog при нажатии FlatButton?

87

Имею следующее 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?

Густаш
источник

Ответы:

151

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

Коллин Джексон
источник
10
Спасибо, это сработало. Вызов Navigator.pop () закрывает диалог, как и ожидалось. Мой текущий onPressed выглядит следующим образом: onPressed: () => Navigator.pop(context),
Gustash
@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),) , child: Center (child: Text ('привет друзья'),),);},); } Пожалуйста, подскажите, как я могу скрыть этот диалог. Благодарю.
Камлеш
У меня тоже сработало!
Даниэль
76
Navigator.of(context, rootNavigator: true).pop('dialog')

работал со мной.

AbdulMomen عبدالمؤمن
источник
5
Принятый ответ
привел
6
это лучший подход, чтобы закрыть диалоговое окно, я пробовал решение, указанное выше, но оно появлялось в моем другом представлении.
Farhana 01
3
В результате принятого ответа моя страница тоже исчезла, это правильный ответ, чтобы скрыть диалог.
Бен
Ответ по-прежнему вызывает всплытие всего представления.
karrar kazuya
что такое rootNavigator?
К Прадип Кумар Редди
22
Navigator.pop(_)

у меня работал, но в галерее Flutter Team есть пример, использующий:

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

что тоже работает, и я хочу последовать их примеру.

Брайон Никосон
источник
1
Я вызываю Custom 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
  }
});
CopsOnRoad
источник
В чем разница между этими двумя строками кода ??
К Прадип Кумар Редди
@ user3410835 Никакой разницы, фактически Navigator.pop()вызывает первую строку.
CopsOnRoad
Как сделать так, чтобы AlertDialog отклонялся = false? Чтобы диалог не закрывался, когда я нажимаю на экран за пределами диалога.
К Прадип Кумар Редди
@ 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

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

jitsm555
источник
что будет делать pop (false)? а что будет делать поп (правда)? В любом случае, в обоих случаях мы хотим, чтобы AlertDialog был закрыт.
К Прадип Кумар Редди
@ 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() в противном случае вы можете закрыть страницу, если вы перешли с главной на страницу сведений.

                showDialog(
                  context: context,
                  builder: (dialogContext) {
                    return Dialog(
                      child: Column(
                        children: [
                          Text("Content"),
                          RaisedButton(
                            onPressed: () => Navigator.of(dialogContext).pop(),
                            child: Text("Close"),
                          )
                        ],
                      ),
                    );
                  },
                );
Султанмырза Касымбеков
источник
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

передать это в showDialog barrierDismissible : true

любопытный ум
источник
0

Это сработало для меня Navigator.of (context, rootNavigator: true) .pop ('dialog').

Navigator.pop () просто закрывает текущую страницу / экран.

Принц Кельвин
источник
0

В общем-то Navigator.pop(context); работает.

Но если приложение имеет несколько объектов навигатора и dialogBoxне закрывается, попробуйте это

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

Если вы хотите передать вызов результата, попробуйте

Navigator.pop(context,result);

ИЛИ ЖЕ

Navigator.of(context, rootNavigator: true).pop(result)
Вики Салунхе
источник
-3

В принятом ответе указано, как закрыть диалоговое окно с помощью класса Navigator. Чтобы закрыть диалоговое окно без использования навигатора, вы можете установить для события onPressed кнопки следующее:

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

В случае, если приведенный выше код не требует пояснений, он в основном устанавливает для Parent AlertDialog FlatButton значение null, таким образом отклоняя его.

отбосс
источник