如何解除扑动对话?

时间:2018-06-04 15:02:44

标签: dialog flutter

我是新手,我想在完成任务后解雇我的对话框。我试过了:

Navigator.pop(context, true); 

但是我的屏幕变黑了,对话框还在那里。这是我的对话框代码。

Dialog _dialog = new Dialog(
  child: new Row(
    mainAxisSize: MainAsixSize.min, 
    children: <Widget> [
    new CircularProgressIndicator(), 
    new Text("Loading")]),     

); 

8 个答案:

答案 0 :(得分:14)

此代码对我有用:

  BuildContext dialogContext;
  showDialog(
    context: context,
    barrierDismissible: false,
    builder: (BuildContext context) {
      dialogContext = context;
      return Dialog(
        child: new Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            new CircularProgressIndicator(),
            new Text("Loading"),
          ],
        ),
      );
    },
  );

  await _longOperation();
  Navigator.pop(dialogContext);

答案 1 :(得分:13)

如果showDialog关闭后不想返回任何结果,则可以使用

Navigator.pop(context);

如果您要通过结果呼叫

Navigator.pop(context, result);

示例:

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

答案 2 :(得分:7)

https://docs.flutter.io/flutter/material/showDialog.html

  

此方法创建的对话框路径将推送到根导航器。如果应用程序有多个Navigator对象,则可能需要调用Navigator.of(context, rootNavigator: true).pop(result)来关闭对话框,而不仅仅是Navigator.pop(context, result)

所以我假设这两个中的一个应该做你想做的事。

答案 3 :(得分:6)

//it work conrrectly
onPressed: () {
   Navigator.of(context, rootNavigator: true).pop();
},

答案 4 :(得分:5)

如果你不想在showDialog关闭后返回任何结果,可以使用它。

Navigator.pop(context);

如果你想传递结果调用。

Navigator.pop(context, result);

一个示例将包含如下代码片段:

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

答案 5 :(得分:2)

这将关闭对话框/警报框

bow bow bow
the animal is speaking
The animal is sleeping

答案 6 :(得分:2)

通常Navigator.pop(context);有用。

但是,如果应用程序具有多个Navigator对象,并且dialogBox没有关闭,请尝试执行此操作

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

如果您想通过结果通话,请尝试

Navigator.pop(context,result);

OR

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

答案 7 :(得分:1)

最好使用Completer,因为如果你的操作太短或者设备太慢,那么dialogContext变量不会被初始化,你也无法关闭对话框。

final dialogContextCompleter = Completer<BuildContext>();
showDialog<void>(
  context: context,
  barrierDismissible: false,
  builder: (BuildContext dialogContext) {
    if(!dialogContextCompleter.isCompleted) {
      dialogContextCompleter.complete(dialogContext);
    }
    return AlertDialog(
      content: CircularProgressIndicator(),
    );
  },
);

// Close progress dialog
final dialogContext = await dialogContextCompleter.future;
Navigator.pop(dialogContext);