繁体   English   中英

防止对话框在 Flutter 中的外部触摸时关闭

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM