dart - Flutter:StatelessWidget.build 被多次调用
问题描述
我总是将代码放在我的问题中,但这一次是不可能的,因为错误可能存在于一千行代码中的任何地方。然而:
我注意到我的主屏幕 ( StatelessWidget
) 的构建方法,它是MaterialApp
(home 属性) 的后代,在调试模式下像往常一样调用一次,但在发布模式下调用三次。
在什么情况下会发生这样的事情?我已经尝试过多次复制,但都失败了。
编辑:
问题是我将从媒体查询中获得的屏幕大小存储为全局变量,以便我可以从任何地方访问它。现在我需要在树的下方访问有状态小部件的 init 方法中的该变量。在调试模式下似乎没有问题,但在发布模式下,使媒体查询(必须在内部构建)的小部件的构建方法奇怪地被调用一次,媒体查询的结果是 Size(0.0, 0.0) ,然后调用树更下方的小部件的 init 方法,然后再调用带有媒体查询的 build 方法两次(这次使用正确的屏幕尺寸)。结果是我在 init 方法中没有正确的屏幕尺寸。
解决方案
https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html
未来必须更早获得,例如在 State.initState、State.didUpdateConfig 或 State.didChangeDependencies 期间。在构造 FutureBuilder 时,不能在 State.build 或 StatelessWidget.build 方法调用期间创建它。如果future与FutureBuilder同时创建,那么每次FutureBuilder的parent重建时,异步任务都会重新启动。
一般准则是假设每个构建方法都可以在每一帧被调用,并将省略的调用视为优化。
(取自https://github.com/flutter/flutter/issues/27847#issuecomment-462868299)
推荐阅读
- aws-codepipeline - AWS Codecommit - Codebuild 将分支名称传递给 buildspec.yml
- c# - 哪种缓存方法适合新版本的网站?
- grafana - 从 Prometheus 查询中过滤掉当前未设置值的系列
- oauth-2.0 - OpenIddict-如何使客户端能够请求有关授予其权限的所有用户的数据
- javascript - 带有转到网址按钮的条件下拉框?
- r - R数据框 - 添加具有年季度开始日期的新列
- powershell - 使用 powershell 管道更改某些 JSON 文件的内容
- python - wbserver roundSlider 小部件不启动/更新音频程序
- sql-server - Python Turbodbc executemanycolumns 错误:无法将 Python 实例转换为 C++ 类型(在调试模式下编译以获取详细信息)
- vba - 在 Access 中获取文本框的宽度