问题描述
我有两个应用“屏幕”,分别是 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 失去焦点时的任何重建潜力。