如何在FlatButton单击时关闭AlertDialog?


82

我有以下几点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

Answers:


137

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


9
谢谢,那工作。调用Navigator.pop()将按预期关闭对话框。我当前的onPressed如下: onPressed: () => Navigator.pop(context),
古斯塔什(Gustash)'17年

@柯林,我已经创建了一个函数来显示另一个函数的对话框。void showLoader(context){showDialog(context:context,builder:(BuildContext context){return Container(width:double.infinity,height:double.infinity,decor:BoxDecoration(color:Colors.black.withOpacity(0.05),) ,child:Center(child:Text('hello friends'),),);},); 请建议我如何隐藏此showdialog。谢谢。
Kamlesh

63
Navigator.of(context, rootNavigator: true).pop('dialog')

和我一起工作。


5
接受的答案导致我的整个页面消失,这是隐藏对话框的正确答案
user969068

5
这是关闭对话框的一种更好的方法,我正在尝试上面的解决方案,但它弹出了我的另一个视图。
Farhana

3
接受的答案也导致我的页面消失,这是隐藏对话框的正确答案。

答案仍然会导致整个视图弹出。
karrar kazuya

什么是rootNavigator?
K Pradeep Kumar Reddy

20
Navigator.pop(_)

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

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

这也有效,我很想效仿他们的领导。


1
我从另一个.dart文件调用Custom AlertDialog,并使用Navigator.of(context,rootNavigator:true).pop(); 工作谢谢。
djalmafreestyler

1
我一直使用第一个版本...但是遇到了第二个版本的示例,但是第一个版本删除了它下面的屏幕。
威廉·特里尔

15

如果您不想返回任何结果,请使用以下两个方法之一:

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

这两行代码有什么区别?
K Pradeep Kumar Reddy

@ user3410835没什么不同,实际上是Navigator.pop()调用第一行。
CopsOnRoad

如何使AlertDialog可忽略= false?因此,当我单击对话框外的屏幕时,不会关闭该对话框。
K Pradeep Kumar Reddy

@ user3410835有一个名为barrierDismissibleshowDialog()的属性,您可以将其设置为false或true。
Prabowo Murti

5

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

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时返回假值Navigator.of(context).pop(true)-当我们按YES时返回真值

基于这些返回值,我们可以在其外部执行一些操作或维护对话框状态值


pop(false)将做什么?pop(true)会做什么?无论如何,在这两种情况下,我们都希望AlertDialog被关闭。
K Pradeep Kumar Reddy

@ user3410835:修改了代码,请看一下
jitsm555

4

这完全有效

      RaisedButton(
                child: Text(
                  "Cancel",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blue,
                onPressed: () => Navigator.pop(context),
              ),

2

您可以将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);
  }

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

1

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

0

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

FlatButton(
           child: Text('NO'),
           onPressed: () {
             Navigator.popAndPushNamed(context, 'current_user_location');
              },
           ),

0

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

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

0

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

RaisedButton(
     onPressed: () { Navigator.of(context).pop();},
     child: Text("Close",style: TextStyle(color: Colors.white), ),
                color: Colors.black,
           )


0

这对我有用Navigator.of(context,rootNavigator:true).pop('dialog')。

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


-3

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.