这个问题在这里已有答案:
我总是把代码放在我的问题中,但这次不可能,因为bug可能是千行代码中的任何一个。然而:
我注意到我的主屏幕(StatelessWidget
)的构建方法,它是MaterialApp
(home属性)的后代,在调试模式下通常调用一次,但在发布模式下调用三次。
在哪种情况下会发生这样的事情?我已经尝试过多次复制,但都失败了。
编辑:
问题是我将从媒体查询获得的屏幕大小存储为全局变量,以便我可以从任何地方访问它。现在我需要在树的下一个有状态小部件的init方法中访问该变量。在调试模式下似乎没有问题,但在发布模式下,使得媒体查询(必须在内部构建中)的窗口小部件的构建方法奇怪地被调用一次,媒体查询的结果是大小(0.0,0.0)然后调用树下面的小部件的init方法,然后再调用带有媒体查询的构建方法两次(这次使用正确的屏幕大小)。结果是我在init方法中没有正确的屏幕大小。
https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html
未来必须早先获得,例如在State.initState,State.didUpdateConfig或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或StatelessWidget.build方法调用期间创建它。如果将来与FutureBuilder同时创建,则每次重建FutureBuilder的父级时,都将重新启动异步任务。
一般原则是假设每个构建方法都可以在每个帧中调用,并将省略的调用视为优化。
(取自https://github.com/flutter/flutter/issues/27847#issuecomment-462868299)