【问题标题】:Prevent dialog from closing on outside touch in Flutter防止对话框在 Flutter 中关闭外部触摸
【发布时间】:2023-03-31 00:35:01
【问题描述】:

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

任何帮助将不胜感激,在此先感谢您。

【问题讨论】:

标签: android ios dialog dart flutter


【解决方案1】:

始终使用顶级 Flutter 包,例如 get

Get.generalDialog(pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation,) {
      return SimpleDialog(
        ...
      );
    }, barrierDismissible: false /* its default value */);

【讨论】:

    【解决方案2】:

    只需添加此行

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

    【讨论】:

      【解决方案3】:

      如果您想在按下后退按钮时阻止对话框关闭,请参考以下代码。您必须将 AlertDialog 包装在 WillPopScope 小部件中,并使用返回 Future.value(false) 的函数使 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: () {
                      },
                    ),
                  ],
                )
              )
            },
          );
      

      【讨论】:

      • 现在无法使用onWillPop: (){}。适当的变体是onWillPop: () =&gt; Future.value(false)
      • onWillPop: () async =&gt; false,
      • @ValentinaKonyukhova 是的,你是对的。我已经更新了我的答案。谢谢
      【解决方案4】:

      有一个名为 barrierDismissible 的属性,您可以将其传递给 showDialog ;这使得对话框在外部点击时可以关闭或不关闭

      showDialog(
        barrierDismissible: false,
        builder: ...
      )
      

      【讨论】:

      • 如何处理barrierDismissible.. 比如点击外部添加不同的活动
      • 在 Android 中,您仍然可以通过按 BACK 按钮关闭对话框。有没有办法防止这种情况发生?
      • Alex,您可以使用 WillPopScope 封装对话框构建器小部件。检查这个答案:stackoverflow.com/questions/45916658/…
      • 如果你使用showModalBottomSheet那么你需要转isDismissible: false
      • showCupertinoDialog 也有这个属性。
      猜你喜欢
      • 2012-08-19
      • 2014-06-25
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      相关资源
      最近更新 更多