【问题标题】:Flutter: When might SystemChrome.setEnabledSystemUIOverlays value override subsequent screen overlay valuesFlutter:SystemChrome.setEnabledSystemUIOverlays 值何时会覆盖后续的屏幕覆盖值
【发布时间】:2020-08-17 03:46:08
【问题描述】:

我有两个应用程序“屏幕”,AB。两者都在构建方法中设置了SystemChrome.setEnabledSystemUIOverlays

A

设置
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
    return WillPopScope(
    ....

B

设置
  Widget build(BuildContext context) {
    if (MediaQuery.of(context).orientation == Orientation.landscape) {
      SystemChrome.setEnabledSystemUIOverlays([]);
    }
    else {
      SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
    }
    return WillPopScope(
    .....

在纵向中从 A 导航到 B 效果很好。但是,如果我在 B 中输入横向,则颤动会删除叠加层,然后立即重新实现它们,即我看到叠加层消失并迅速重新出现。如果我从 A 完全删除覆盖线,B 工作正常。它就像 B 被重建,然后是 A 但在后台。是这样的吗?

我是这样导航的

Navigator.push(context, MaterialPageRoute(builder: (mContext) => DataForm(file: _file)))

我三天来一直在跟踪这个错误。作为参考,在我的所有代码中仅在此处设置了叠加层。该问题仅出现在 Android 上。

我很欣赏第一个响应将是“它在您的代码中,我们需要查看它来解决它”。我尝试在“最小代码”中重现该问题以发布示例,但我无法让错误再次发生,而且我的代码非常广泛,我不知道如何全部显示。

根据标题,我问的是什么场景可能会导致屏幕 A 覆盖设置在每次构建时影响屏幕 B

提前致谢!

【问题讨论】:

    标签: flutter system overlay


    【解决方案1】:

    在追踪我的错误 5 天后回答我自己的问题,希望将来它可能对其他人有所帮助。我怀疑那些有经验的人会想'是的,当然',所以这可能更适合像我这样的新人。

    SystemUIOverlay 就像一个全局变量,持久存在于应用程序中,并自动跨屏幕实现。新的屏幕/代码可以随时更改此覆盖设置,并知道是否将全局和追溯应用到所有屏幕。在我的例子中,SystemUIOverlay 设置在 build 中,因此屏幕 A 中强制重建的任何操作都将因此强制更新并将全局覆盖值应用于 B

    即使屏幕 A 未显示,但如果触发,它仍可以在后台继续重建,即使屏幕 B 已打开。因此,在 B 处于打开状态时触发 A 重建的任何事情都意味着 B 将全局采用 A 的覆盖设置。这就是我看到的结果。

    几个例子:

    正如here 所引用的,MediaQuery.of 将导致您的小部件在 MediaQueryData 更改时自动重建(例如,如果用户旋转他们的设备)。因此,例如,如果您在屏幕 A 的构建中包含“MediaQuery.of”anywhere,则即使不在焦点上也可能会发生构建。 A 的这种重建然后在全局范围内强制执行它的覆盖值,该值在打开时由 B 拾取。

    在我的情况下,重建 B 将覆盖设置为[] 并影响insetsA 中的MediaQuery 发现了这一点,重建并将覆盖重置为.values,并将它们强制到B。她转了转。

    A 中调用 setState 的周期性计时器会做同样的事情。我相信还有更多的例子。

    因此,当 A 失去焦点时,请注意并避免任何重建潜力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多