【发布时间】:2019-04-12 21:21:40
【问题描述】:
我总是将代码放在我的问题中,但这次是不可能的,因为错误可能存在于一千行代码中的任何地方。然而:
我注意到我的主屏幕 (StatelessWidget) 的构建方法是 MaterialApp(home 属性)的后代,在调试模式下像往常一样调用一次,但在发布模式下调用三次。
在什么情况下会发生这样的事情?我已经尝试过多次复制,但都失败了。
编辑:
问题是我将从媒体查询获得的屏幕大小存储为全局变量,以便我可以从任何地方访问它。现在我需要在树的下方访问有状态小部件的 init 方法中的该变量。在调试模式下似乎没有问题,但在发布模式下,使媒体查询(必须在内部构建)的小部件的构建方法奇怪地被调用一次,媒体查询的结果是 Size(0.0, 0.0) ,然后调用树更下方的小部件的 init 方法,然后再调用带有媒体查询的 build 方法两次(这次使用正确的屏幕尺寸)。结果是我在 init 方法中没有正确的屏幕尺寸。
【问题讨论】:
-
多次调用构建方法会导致哪些问题?
-
build()预计会被多次调用。例如,当键盘弹出时,屏幕尺寸会在动画期间多次更改。调用根小部件的每一帧build()及其所有后代,以允许它们将视图调整为新的屏幕尺寸。 -
使用 StreamController 而不是字段,然后任何感兴趣的人都可以订阅(收听)媒体查询更改。
-
The problem is that I am storing the screen size that I get from a media query as a global variable, so that I can access it from anywhere.这听起来是个坏主意。 Flutter之所以使用everything is a widget这句话就是为了避免这种事情 -
StatfulWidget 的
didChangeDependencies就是为此而生的。可以和MediaQuery.of(context)结合使用
标签: dart flutter statelesswidget