Как я могу отклонить AlertDialog при нажатии кнопки FlatButton?

У меня есть следующее 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?

19 ответов

Решение

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

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

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

Navigator.pop(_)

работал для меня, но галерея команды Flutter содержит пример, использующий:

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

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

Вы можете использовать любое из следующего:

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

Обычно Navigator.pop(context); работает.

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

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

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

      Navigator.pop(context,result);

ИЛИ

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

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

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

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) - вернуть значение false, когда мы нажали NO Navigator.of(context).pop(true) - вернуть значение true, когда мы нажали YES

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

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

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

Это работает превосходно

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

Используйте следующий код для закрытия диалогового окна

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

Помогло бы создание отдельного контекста для диалогового окна предупреждений.

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

Этого достаточно, чтобы отклонить диалог добавления внутри любого обратного вызова, такого как
onpressed, ontap

      Navigator.of(context).pop();

          AlertDialog(
          title: Center(child: Text("$title")),
          insetPadding: EdgeInsets.zero,
          titlePadding: EdgeInsets.only(top: 14.0, bottom: 4),
          content: Container(
            height: 50,
            child: TextFormField(
              controller: find_controller,
              decoration: InputDecoration(
                suffixIcon: context.watch<MediaProvider>().isChangeDialog
                    ? IconButton(
                        onPressed: () {
                          clearController(find_controller);
                        },
                        icon: Icon(Icons.clear))
                    : null,
                border: OutlineInputBorder(
                    borderSide: BorderSide(color: Colors.deepPurpleAccent)),
                hintText: 'Id',
              ),
              onChanged: (val) {
                if (val.isNotEmpty)
                  context.read<MediaProvider>().isChangeDialog = true;
                else
                  context.read<MediaProvider>().isChangeDialog = false;
              },
            ),
          ),
          actions: [
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Padding(
                  padding: const EdgeInsets.all(4.0),
                  child: OutlinedButton(
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Align(
                            child: Padding(
                              padding: const EdgeInsets.symmetric(horizontal: 12.0),
                              child: Icon(Icons.clear),
                            ),
                          ),
                          Text("Cancel")
                        ],
                      ),
                      onPressed: () {
                        context.read<MediaProvider>().isChangeDialog = false;
//========================this enough to dismisss dialog
                        Navigator.of(context).pop();
                      }),
                ),
                Padding(
                  padding: const EdgeInsets.all(4.0),
                  child: ElevatedButton(
                      onPressed: context.watch<MediaProvider>().isChangeDialog
                          ? () {
                              context.read<MediaProvider>().isChangeDialog = false;
                              okCallback;
                            }
                          : null,
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Align(
                            child: Padding(
                              padding: const EdgeInsets.symmetric(horizontal: 12.0),
                              child: Icon(Icons.check),
                            ),
                          ),
                          Text("OK")
                        ],
                      )),
                )
              ],
            ),
          ],
        );

Для закрытия диалога

      void cancelClick() {
    Navigator.pop(context);
  }

Использовать 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);
                    },
                ),
              ],
            ),
        );

Этот ответ работает, если вы хотите открыть диалоговое окно и перейти к другому представлению. Эта часть 'current_user_location'- строка, которую маршрутизатор должен знать, к какому представлению перейти.

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

Вы можете обернуть свой 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);
  }

Передать это в showDialogbarrierDismissible : true

использовать получить пакет. затем Get.back(), чтобы закрыть Modal

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

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

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

Другие вопросы по тегам