123

我有以下AlertDialog

showDialog(
            context: context,
            child: new AlertDialog(
              title: const Text("Location disabled"),
              content: const Text(
                  """
Location is disabled on this device. Please enable it and try again.
                  """),
              actions: [
                new FlatButton(
                  child: const Text("Ok"),
                  onPressed: _dismissDialog,
                ),
              ],
            ),
        );

我怎样才能让_dismissDialog()解雇说AlertDialog

4

17 回答 17

203

Navigator.pop()应该做的伎俩。您还可以使用它来返回对话框的结果(如果它为用户提供了选择)

于 2017-05-24T13:49:00.967 回答
127
Navigator.of(context, rootNavigator: true).pop('dialog')

和我一起工作。

于 2018-07-02T18:24:29.737 回答
31
Navigator.pop(_)

为我工作,但 Flutter 团队的画廊包含一个使用示例:

Navigator.of(context, rootNavigator: true).pop()

这也有效,我很想效仿他们的做法。

于 2018-09-22T16:49:35.150 回答
23

如果您不想返回任何结果,请使用其中任何一个:

Navigator.of(context).pop();
Navigator.pop(context);

但是,如果您确实想返回一些结果,请参阅此

例子:

showDialog(
    context: context,
    builder: (_) {
      return AlertDialog(
        title: Text('Wanna Exit?'),
        actions: [
          FlatButton(
            onPressed: () => Navigator.pop(context, false), // passing false
            child: Text('No'),
          ),
          FlatButton(
            onPressed: () => Navigator.pop(context, true), // passing true
            child: Text('Yes'),
          ),
        ],
      );
    }).then((exit) {
  if (exit == null) return;

  if (exit) {
    // user pressed Yes button
  } else {
    // user pressed No button
  }
});
于 2018-10-29T11:36:27.137 回答
11

一般Navigator.pop(context);有效。

但是如果应用程序有多个 Navigator 对象并且dialogBox没有关闭,那么试试这个

Navigator.of(context, rootNavigator: true).pop();

如果您想通过结果调用,请尝试

Navigator.pop(context,result);

或者

Navigator.of(context, rootNavigator: true).pop(result);
于 2020-12-07T13:24:18.917 回答
6

单击平面按钮时关闭警报对话框的示例

RaisedButton(
        onPressed: () {
          showDialog(
              context: context,
              builder: (context) => AlertDialog(
                    title: Text('Are you sure?'),
                    content: Text('Do you want to remove item?'),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop(false),//  We can return any object from here
                           child: Text('NO')),
                      FlatButton(
                          onPressed: () => Navigator.of(context).pop(true), //  We can return any object from here
                          child: Text('YES'))
                    ],
                  )).then((value) =>
              print('Selected Alert Option: ' + value.toString()));
        },
        child: Text('Show Alert Dialog'),
      ),

上面的代码有两个独特的东西,用于提供对话框的回调结果

Navigator.of(context).pop(false) -- 当我们按下 NO 时返回 false 值 Navigator.of(context).pop(true) -- 当我们按下 YES 时返回 true 值

基于这些返回值,我们可以在它之外进行一些操作或者维护对话状态值

于 2020-04-17T10:04:01.360 回答
6

Navigator.of(dialogContext).pop()否则,如果您从主页面导航到详细页面,则可以关闭页面

                showDialog(
                  context: context,
                  builder: (dialogContext) {
                    return Dialog(
                      child: Column(
                        children: [
                          Text("Content"),
                          RaisedButton(
                            onPressed: () => Navigator.of(dialogContext).pop(),
                            child: Text("Close"),
                          )
                        ],
                      ),
                    );
                  },
                );
于 2020-09-23T11:15:09.267 回答
4

这工作得很好

      RaisedButton(
                child: Text(
                  "Cancel",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
                onPressed: () => Navigator.pop(context),
              ),
于 2019-07-04T07:35:34.317 回答
1

采用Navigator.pop(context);

例子

showDialog(
            context: context,
            child: new AlertDialog(
              title: const Text("Location disabled"),
              content: const Text(
                  """
Location is disabled on this device. Please enable it and try again.
                  """),
              actions: [
                new FlatButton(
                  child: const Text("Ok"),
                  onPressed: () {
                      Navigator.pop(context);
                    },
                ),
              ],
            ),
        );
于 2020-04-26T12:43:58.967 回答
1

为警报对话框创建一个单独的上下文会有所帮助。

showDialog(
  context: context,
  builder: (alertContext) => AlertDialog(
    title: const Text("Location disabled"),
    content: const Text(
        """Location is disabled on this device. Please enable it and try again."""),
    actions: [
      new FlatButton(
        child: const Text("Ok"),
        onPressed: () => Navigator.pop(alertContext),
      ),
    ],
  ),
);
于 2020-08-06T09:49:38.713 回答
1

请使用以下代码关闭对话框

RaisedButton(
     onPressed: () { Navigator.of(context).pop();},
     child: Text("Close",style: TextStyle(color: Colors.white), ),
                color: Colors.black,
           )
于 2020-08-23T15:16:51.490 回答
1

这行得通for me Navigator.of(context, rootNavigator: true).pop('dialog')

Navigator.pop()只是关闭当前页面/屏幕。

于 2020-10-22T14:27:06.583 回答
0

如果您想弹出对话框并导航到另一个视图,则此答案有效。这部分' current_user_location'是路由器需要知道导航到哪个视图的字符串。

FlatButton(
           child: Text('NO'),
           onPressed: () {
             Navigator.popAndPushNamed(context, 'current_user_location');
              },
           ),
于 2020-07-29T19:02:04.903 回答
0

您可以将 AlertDialog 包装在异步方法中以使事情变得干净。

  _showAlertConfirmDelete() async {
    // the response will store the .pop value (it can be any object you want)
    var response = await showDialog(
        context: context,
        builder: (context) => AlertDialog(
              title: Text('Warn'),
              content: Text('Really wants to remove the record?'),
              actions: <Widget>[
                FlatButton(
                    onPressed: () => Navigator.of(context)
                        .pop(false), 
                    child: Text('No')),
                FlatButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: Text('Yes'))
              ],
            ));
    // do you want to do with the response.
    print(response);
  }
于 2020-08-28T11:42:36.173 回答
0

在 showDialog 中传递它 barrierDismissible : true

于 2020-09-07T13:33:57.557 回答
0

这足以消除对话框添加在任何回调中,如
onpressed,ontap

Navigator.of(context).pop();

    AlertDialog(
          title: Center(child: Text("$title")),
          insetPadding: EdgeInsets.zero,
          titlePadding: EdgeInsets.only(top: 14.0, bottom: 4),
          content: Container(
            height: 50,
            child: TextFormField(
              controller: find_controller,
              decoration: InputDecoration(
                suffixIcon: context.watch<MediaProvider>().isChangeDialog
                    ? IconButton(
                        onPressed: () {
                          clearController(find_controller);
                        },
                        icon: Icon(Icons.clear))
                    : null,
                border: OutlineInputBorder(
                    borderSide: BorderSide(color: Colors.deepPurpleAccent)),
                hintText: 'Id',
              ),
              onChanged: (val) {
                if (val.isNotEmpty)
                  context.read<MediaProvider>().isChangeDialog = true;
                else
                  context.read<MediaProvider>().isChangeDialog = false;
              },
            ),
          ),
          actions: [
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Padding(
                  padding: const EdgeInsets.all(4.0),
                  child: OutlinedButton(
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Align(
                            child: Padding(
                              padding: const EdgeInsets.symmetric(horizontal: 12.0),
                              child: Icon(Icons.clear),
                            ),
                          ),
                          Text("Cancel")
                        ],
                      ),
                      onPressed: () {
                        context.read<MediaProvider>().isChangeDialog = false;
//========================this enough to dismisss dialog
                        Navigator.of(context).pop();
                      }),
                ),
                Padding(
                  padding: const EdgeInsets.all(4.0),
                  child: ElevatedButton(
                      onPressed: context.watch<MediaProvider>().isChangeDialog
                          ? () {
                              context.read<MediaProvider>().isChangeDialog = false;
                              okCallback;
                            }
                          : null,
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Align(
                            child: Padding(
                              padding: const EdgeInsets.symmetric(horizontal: 12.0),
                              child: Icon(Icons.check),
                            ),
                          ),
                          Text("OK")
                        ],
                      )),
                )
              ],
            ),
          ],
        );

在此处输入图像描述

于 2021-09-20T12:33:40.920 回答
-4

接受的答案说明了如何使用 Navigator 类关闭对话框。要在不使用 Navigator 的情况下关闭对话框,您可以将按钮的 onPressed 事件设置为以下内容:

setState((){
  thisAlertDialog = null; 
});

如果上面的代码不是不言自明的,它基本上是将 FlatButton 的 Parent AlertDialog 设置为 null,从而将其关闭。

于 2019-01-05T13:58:31.740 回答