如何关闭颤振对话框?

Posted

技术标签:

【中文标题】如何关闭颤振对话框?【英文标题】:How to dismiss flutter dialog? 【发布时间】:2018-11-13 23:06:20 【问题描述】:

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

Navigator.pop(context, true); 

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

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

); 

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这里的“结果”是什么? result 是调用showDialogroute 可以接收的可选参数。例如,如果您的对话框选择 UI 需要使用的值,这将非常有用。 当您关闭对话框时,您希望从showDialog() 返回的Future 的任何值都完成。 0.3.2 听起来有点过时了。实际是什么状态。 “它适用于真实设备”和“也不适用于 android 设备”似乎是矛盾的。 适用于ios设备,但不适用于android设备和模拟器,让我尝试升级flutter。非常感谢@GünterZöchbauer【参考方案2】:

这段代码对我有用:

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

【讨论】:

这应该是公认的答案。使用不是来自构建器的上下文会导致屏幕导航弹出而不是关闭对话框。 同意@AxesGrinds 如果用户在 _longOperation 仍在进行时按下返回按钮会发生什么? 太棒了,这帮助我解决了使用基本Navigator.of(context).pop() 对话框不会关闭的边缘情况。谢谢! 对于 CupertinoTabScaffold 内的弹出窗口,这对我不起作用。下面的屏幕将被关闭,但弹出窗口将保留(再次单击会引发小部件没有根的异常)。 CupertinoTabScaffold 有多个导航器对象,而对话框被推送到根导航器。【参考方案3】:

如果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
  
);

【讨论】:

【参考方案4】:
//it work conrrectly
onPressed: () 
   Navigator.of(context, rootNavigator: true).pop();
,

【讨论】:

【参考方案5】:

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

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

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

如果你想通过结果调用,试试

Navigator.pop(context,result);

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

【讨论】:

【参考方案6】:

这将关闭对话框/警告框

Navigator.of(context).pop();

【讨论】:

【参考方案7】:

最好使用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);

【讨论】:

我认为这应该是公认的答案。我必须检测是否打开了多个对话框并处理仅打开单个对话框的情况。这是可靠关闭它们的唯一方法。

以上是关于如何关闭颤振对话框?的主要内容,如果未能解决你的问题,请参考以下文章

在颤振中重新启动(再次关闭和打开)后对话框状态不会改变

关闭运行颤振应用程序的浏览器选项卡时,有没有办法显示警告对话框?

颤振:如何在应用程序开始之前显示对话框?

颤振选择对话框 - 将过滤器字段滚动到视图中

颤振:列文本想要在中心

使用后退按钮颤振测试 WillPopScope