Flutter:什么时候SystemChrome.setEnabledSystemUIOverlays值可以覆盖后续的屏幕覆盖值

问题描述

我有两个应用“屏幕”,分别是 A B 。两者都在构建方法中设置了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

谢谢!

解决方法

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

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

即使未显示屏幕 A ,即使打开了屏幕 B ,它也可以在后台继续重建。因此,在 B 处于打开状态时触发 A 重建的任何内容表示 B 将全局采用 A 的覆盖设置。这就是我所看到的结果。

几个例子:

如引用here所述,MediaQuery.of会导致您的窗口小部件在MediaQueryData发生更改时(例如,如果用户旋转设备)自动重建。因此,例如,如果在屏幕 A 的构建中包括“ 任意位置”的“ MediaQuery.of”,则即使没有重点关注,也会发生构建。重新构建 A 会强制其全局覆盖值,该值在打开时由 B 拾取。

在我的案例中,重建 B 将覆盖设置为[],并影响了insets。 {strong> A 中的MediaQuery对此进行了重新构建,并将叠加层重置为.values,然后将其强制放置在 B 上。她走了。

A 中调用setState的定期计时器将执行相同的操作。我相信还有更多例子。

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