[英]Prevent dialog from closing on outside touch in Flutter
在 Flutter 中,我在异步任务期间为加载程序编写了简单的对话框。 当我触摸外部对话框时,我该如何阻止这种行为?
代码
showDialog(
context: context,
builder: (_) => new Dialog(
child: new Container(
alignment: FractionalOffset.center,
height: 80.0,
padding: const EdgeInsets.all(20.0),
child: new Row(
mainAxisSize: MainAxisSize.min,
children: [
new CircularProgressIndicator(),
new Padding(
padding: new EdgeInsets.only(left: 10.0),
child: new Text("Loading"),
),
],
),
),
));
任何帮助将不胜感激,在此先感谢您。
您可以将一个名为barrierDismissible
的属性传递给showDialog
; 这使得对话框在外部点击时可以关闭或不关闭
showDialog(
barrierDismissible: false,
builder: ...
)
如果您想在按下后退按钮时阻止对话框关闭,请参阅下面的代码。 您必须将 AlertDialog 包装在 WillPopScope 小部件中,并使用返回 Future.value(false) 的 function 设置 onWillPop 属性值。
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return WillPopScope(
onWillPop: () => Future.value(false),
child:AlertDialog(
title: new Text("Alert Title"),
content: new SingleChildScrollView(
child: Container(),),
actions: <Widget>[
new FlatButton(
child: new Text("Close"),
onPressed: () {
},
),
],
)
)
},
);
只需添加此行
barrierDismissible: false,
就像
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(
"Classes",
style: TextStyle(
fontSize: 24, color: Colors.black, fontFamily: 'intel'),
),
content: setupAlertDialoadClassList(
context, listClasses, Icons.class__outlined, 0),
);
});
始终使用顶级 flutter 包,如get
Get.generalDialog(pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation,) {
return SimpleDialog(
...
);
}, barrierDismissible: false /* its default value */);
barrierDismissible:假,
如下所述使用这个。 showDialog(barrierDismissible: false, builder // 代码 //
这将禁用设备导航
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return WillPopScope(
onWillPop: () async => false,
child:AlertDialog(
title: new Text("Alert Title"),
content: new SingleChildScrollView(
child: Container(),),
actions: <Widget>[
new FlatButton(
child: new Text("Close"),
onPressed: () {
},
),
],
)
)
},
);
如果您不使用 showDialog,否则您使用的是 GestureDetectore,我刚刚做了一个简单的方法,只需将一个 GestureDetector 放在另一个 GestureDetector 中,然后设置 onTap 操作(如果这两个 GestureDetector 都是您的情况,其中一个不同)你要放一个动作,在另一个动作中你可以把它留空,就像这样。
GestureDetector(
onTap: () { //The Gesture you dont want to afect the rest
Navigator.pop(context);
},
child: Container(
color: Colors.transparent,
child:GestureDetector(
onTap: () {}, //This way is not going to afect the inside widget
child: Container() //your widget
)
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.