呈现和关闭模式小部件流的正确方法是啥?

Posted

技术标签:

【中文标题】呈现和关闭模式小部件流的正确方法是啥?【英文标题】:What is the correct way to present and dismiss a modal widget flow?呈现和关闭模式小部件流的正确方法是什么? 【发布时间】:2020-04-08 10:02:21 【问题描述】:

我是 Flutter 的新手,来自 ios 开发。我正在尝试创建一个可以从应用程序中的任何位置启动的模态小部件流/旅程,但我无法掌握如何正确呈现和关闭模态流。

每当我想从应用程序的某处呈现模态流时,都会调用此函数:

Widget launchModalFlow() 
  return Navigator(
    onGenerateRoute: (settings) => MaterialPageRoute(
      settings: settings,
      builder: (BuildContext _) => FirstStepScreen(
        didComplete: (context) 
          _pushSecondScreen(context); // this is a method which uses Navigator.of(context) to push another widget onto the navigation stack
        ,
      ),
    ),
  );

它是这样称呼的:

Navigator.of(context, rootNavigator: true).push(new MaterialPageRoute(
  builder: (BuildContext context) 
    return launchModalFlow();
  ,
  fullscreenDialog: true,
));

每当我想关闭模态流时,我都会在模态流中执行此操作,例如当您在应用栏中点击关闭或到达流的末尾时:

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

虽然这种工作,但感觉不合适(可能更多,但主要是)两个原因:

    模式流不需要关心它是从哪里呈现出来的。现在它假设它显示在根导航器上,它现在可以工作,但将来可能会中断。

    模态流中的第一个屏幕不会自动在脚手架应用栏中获得关闭按钮。我的印象是,如果操作正确,您将免费获得它。这是正确的吗?

所以我想我的问题是:如果我使用不是根导航器的导航器呈现模态流,我如何获得对呈现导航器的引用以关闭流?还是我采取了完全不正确的方法?

脚注:

    为简洁起见,代码示例被删减 我正在使用 iOS 术语(存在和关闭),对此感到抱歉! 到目前为止,我只在 iOS 模拟器上测试过这个

【问题讨论】:

【参考方案1】:

这很简单。

Navigator.of(context).pop();

不要因为对自己太用力而感到困惑。

【讨论】:

我记得尝试过这个并导致黑屏。有机会我会再试一次并报告。 您好,抱歉耽搁了。我刚刚回到这一点并对其进行了测试,如果我创建一个子导航器(如我的问题中的 launchModalFlow 函数所示),它只会导致黑屏。

以上是关于呈现和关闭模式小部件流的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Dojo 小部件未正确呈现

用于聊天窗口 irc 的 GTK 最好的小部件是啥? [关闭]

找不到正确的Provider在带有导航流的Flutter中,此Y小部件上方

qtcreator设计模式是啥类型的qWidget?

将 GoDaddy 托管 Wordpress 与 Elementor 一起使用时,HTML 小部件无法正确呈现

Qt:QScrollArea 中的自定义小部件