Как я могу отклонить 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);
}
использовать получить пакет. затем Get.back(), чтобы закрыть Modal
В принятом ответе указывается, как закрыть диалоговое окно с помощью класса Navigator. Чтобы закрыть диалоговое окно без использования Навигатора, вы можете установить для события onPressed кнопки следующее:
setState((){
thisAlertDialog = null;
});
В случае, если приведенный выше код не говорит само за себя, он в основном устанавливает значение Parent AlertDialog для FlatButton в значение null, что исключает его.