如何在单击平面按钮时取消 AlertDialog?

我有以下 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

118452 次浏览

Navigator.pop() 应该就可以了。您还可以使用它来返回对话框的结果(如果它向用户提供了选择的话)

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

和我一起工作。

Navigator.pop(_)

对我来说很有用,但是扑动团队的图库中包含了一个例子:

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

这也行得通,我很想跟随他们的脚步。

如果您不想返回任何结果,请使用以下两种方式:

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

接受的答案说明了如何使用 Navigator 类取消对话框。如果不使用 Navigator 而要关闭对话框,可以将按钮的 onPress 事件设置为:

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

如果上面的代码不是自解释的,那么它基本上就是将 FlatButton 的 Parent AlertDialog 设置为 null,从而忽略它。

效果很好

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

单击平面按钮时消除警报对话框的示例

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

上面的代码有两个独特的东西,用于提供对话框 的回调结果

Pop (false)——当我们按下 NO Navigator.of (context) . pop (true)——当我们 按“是”

基于这些返回值,我们可以在它之外执行一些操作或维护对话框状态值

使用 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');
},
),

为 Alert Dialog 创建一个单独的上下文会有所帮助。

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

请使用以下代码关闭对话框

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

在 showDialog 中传递它 barrierDismissible : true

否则,如果从主页导航到详细信息页,则可以关闭页面

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

for me Navigator.of(context, rootNavigator: true).pop('dialog')成功了。

Navigator.pop()只关闭当前页面/屏幕。

一般来说,Navigator.pop(context);可以工作。

但是如果应用程序有多个 Navigator 对象,而 dialogBox没有关闭,那么尝试这样做

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

如果要传递结果调用,请尝试

Navigator.pop(context,result);

或者

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

这足以使对话框消失,添加到任何回调中,比如 < br/> < em >

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

enter image description here

使用 走开软件包。 然后 Get.back ()关闭 Modal