【问题标题】:In Flutter is there a way to check if the visible page has been presented modally在 Flutter 中有一种方法可以检查可见页面是否已以模态方式呈现
【发布时间】:2021-03-24 20:57:26
【问题描述】:

这是 iOS 的一个常见问题,并且很容易解决,因为所有 UIViewControllers 都具有检查它们的呈现方式的属性;无论是模态还是被压入堆栈。

Flutter 中,我们没有视图控制器,因此我们推送新路由,其中​​一个选项是使用fullScreenDialog。然后,您的应用栏将有一个关闭按钮,并在点击时自动pop

但是,如果您想根据 Scaffold 小部件是否以这种方式呈现来动态调整它们,似乎没有办法检测您是否处于 fullScreenDialog 状态(或模态)。我有一些页面是根选项卡导航的一部分,因此显示了一个选项卡栏以在部分之间切换。我想重用其中一些页面,但以模态方式呈现它们。在这种情况下,我想删除标签栏。

有什么方法可以检测NavigatorScaffold 是否以模态方式呈现?还是我只需要传入一个isModal bool?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    我正在考虑根据您的需求和用例可能会采用不同的解决方案。 你宁愿不重复代码只是为了在不需要时删除 appBar,这是值得尊敬的。

    这是我的建议,它可以配合并利用框架,而不是与之抗衡。

    1. 创建您的 MultiPurposeSuperUsefulWidget,无需脚手架或 appBar。

    2. 即使使用 tabBar 导航,这个小部件也可以轻松显示。

    3. 障碍是想在模态模式下使用它,你可以选择创建这个模态小部件/屏幕模板,它需要一个final Widget widget 构造函数。

    4. 按照你喜欢的方式自定义这个模态模板,我们称之为ModalTemplateScreen

    5. 最后,当您希望 MultiPurposeSuperUsefulWidget 以模态样式显示时,导航到 ModalTemplateScreen(widget: MultiPurposeSuperUsefulWidget) 并将您的可重用小部件作为参数传递。

    【讨论】:

    • 我明白你的意思了,但不仅仅是应用栏或底部导航需要根据模态进行更改,body 的元素可能需要推送其他路由并知道它们是由模态模板。
    • 我相信他们在编写代码时事先知道哪些屏幕和小部件将以任何一种模式显示。对于模态,您可以将所需的行为放在这个单一模板中。
    【解决方案2】:

    要根据模态设置应用栏的属性,您需要访问当前的Route,然后检查路由是否显示为fullscreenDialog

    isModal = (ModalRoute.of(context) as PageRoute).fullscreenDialog;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 2012-07-08
      • 2011-11-10
      • 1970-01-01
      • 2019-10-08
      • 2015-11-22
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多