Как отклонить 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')

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


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

В чем разница между этими двумя строками кода ??
К Прадип Кумар Редди

@ 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

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


что будет делать 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

Это сработало для меня 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, таким образом отклоняя его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.