【问题标题】:Flutter: StatelessWidget.build called multiple times [duplicate]Flutter:StatelessWidget.build 被多次调用[重复]
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2020-06-08
    • 2010-10-24
    • 2011-10-18
    相关资源
    最近更新 更多