颤振防止关闭背面的对话框

时间:2020-01-15 16:01:47

标签: flutter

我正在使用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: () {
              },
            ),
          ],
        );
      },
    );

如何使其无法关闭?

3 个答案:

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