dart - Flutter:StatelessWidget.build 被多次调用

我总是将代码放在我的问题中,但这次是不可能的,因为错误可能存在于一千行代码中的任何地方。然而:

我注意到我的主屏幕(StatelessWidget)的构建方法是 MaterialApp(home 属性)的后代,在 Debug模式,但在 Release模式下是 3 次。

在什么情况下会发生这样的事情?我已经尝试过多次复制,但都失败了。

编辑:

问题是我将从媒体查询获得的屏幕大小存储为全局变量,以便我可以从任何地方访问它。现在我需要在树的下方访问有状态小部件的 init 方法中的该变量。在 Debug模式下似乎没有问题,但在 Release模式下,使媒体查询(必须在内部构建)的小部件的构建方法奇怪地被调用一次,媒体查询的结果是 Size(0.0, 0.0) ,然后调用树更下方的小部件的 init 方法,然后再调用带有媒体查询的 build 方法两次(这次使用正确的屏幕尺寸)。结果是我在 init 方法中没有正确的屏幕尺寸。

最佳答案

https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html

future 一定是更早获得的,例如在 State.initState、State.didUpdateConfig 或 State.didChangeDependencies 期间。在构造 FutureBuilder 时,不能在 State.build 或 StatelessWidget.build 方法调用期间创建它。如果future与FutureBuilder同时创建,那么每次FutureBuilder的parent重建时,异步任务都会重新启动。

一般准则是假设每个构建方法都可以在每一帧被调用,并将省略的调用视为优化。

(取自https://github.com/flutter/flutter/issues/27847#issuecomment-462868299)

https://stackoverflow.com/questions/53223469/

相关文章:

datetime - Dart/Flutter 默认日期格式

flutter - Flutter Text 是否支持长字的换行?

firebase - Flutter ListView 跳转到顶部

java - 在 Flutter 应用程序中使用 Java 或其他语言

dart - 如何使 Sink 格式化 Stream 的结果?

android - 在 Dismissible Widget 上禁用关闭方向

flutter - Flutter 中的约束布局等价物是什么?

android - 即使应用程序关闭,也在后台运行 Dart 和 Flutter 中的定期任务

android - 使用 pushNamed() 从屏幕错误中 flutter 返回数据

android - 如何在 Flutter 中删除 Firebase 云消息传递 token