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

Posted

技术标签:

【中文标题】防止对话框在 Flutter 中关闭外部触摸【英文标题】:Prevent dialog from closing on outside touch in Flutter 【发布时间】:2018-11-11 22:12:18 【问题描述】:

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

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

【问题讨论】:

***.com/questions/50635395/… 的副本已经有答案 【参考方案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 封装对话框构建器小部件。检查这个答案:***.com/questions/45916658/… 如果你使用showModalBottomSheet那么你需要转isDismissible: false showCupertinoDialog 也有这个属性。

以上是关于防止对话框在 Flutter 中关闭外部触摸的主要内容,如果未能解决你的问题,请参考以下文章

如何在对话框中关闭 jQuery 对话框?

如何在另一个线程中关闭 MFC 模态对话框并获得对话框返回值?

如何从父关闭按钮单击事件打开的子对话框中关闭父对话框?

如何从另一个活动或底部工作表对话框/片段中关闭一个活动

Android:如何从活动活动中关闭前台活动?

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?