我正在使用showDialog函数构建一个对话框,但是我需要避免当用户按下“后退”按钮时,该对话框不会关闭,这是我的代码:
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return AlertDialog(
title: new Text("Hello"),
content: new SingleChildScrollView(
child: Container(),
actions: <Widget>[
// usually buttons at the bottom of the dialog
new FlatButton(
child: new Text("Close"),
onPressed: () {
},
),
],
);
},
);
如何使其无法关闭?
答案 0 :(得分:8)
您需要像这样将AlertDialon放在WillPopScope
上:
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return WillPopScope(
onWillPop: (){},
child:AlertDialog(
title: new Text("Hello"),
content: new SingleChildScrollView(
child: Container(),),
actions: <Widget>[
// usually buttons at the bottom of the dialog
new FlatButton(
child: new Text("Close"),
onPressed: () {
},
),
],
)
)
},
);
WillPopScope
为您提供了一个onWillPop
参数,您可以在其中传递子弹出时想要的功能。在这种情况下,该参数会收到一个空函数,因此不会弹出。
答案 1 :(得分:6)
您需要使用WillPopScope
。它将使用onWillPop
上的函数来确定对话框是否关闭。在这种情况下,始终为false,因此用户无法使用“后退”按钮关闭对话框。
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
// return object of type Dialog
return WillPopScope(
child: AlertDialog(
title: new Text("Hello"),
content: new SingleChildScrollView(
child: Container(),
),
actions: <Widget>[
// usually buttons at the bottom of the dialog
new FlatButton(
child: new Text("Close"),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
onWillPop: () async {
return false;
},
);
},
);
答案 2 :(得分:4)
您也可以通过在 onWillPop: () => Future.value(false)
中设置 WillPopScope
来实现。现在接受的答案中提到的 onWillPop:(){}
会发出警告。
警告消息: 此函数的返回类型为“Future”,但不以 return 语句结尾。 尝试添加 return 语句,或将返回类型更改为“void”。
因此,请改用 onWillPop: () => Future.value(false)
或 onWillPop: () async {return false;},
。
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return WillPopScope(
child: AlertDialog(
................
),
onWillPop: () => Future.value(false),
);
},
);