【问题标题】:Post Frame Callback - Looping后帧回调 - 循环
【发布时间】:2021-11-16 19:33:06
【问题描述】:

我一直在检查我的应用程序的性能,并注意到其中一个小部件不断循环。在该小部件中,我使用以下代码从 Firestore DB 检索数据,但是对于本示例,我使用相同的循环结果对其进行了简化。

问题:Widget Binding 被多次调用并且循环调用有什么原因吗?我的印象是它在小部件构建完成时被调用一次。我应该为一次性后期构建功能使用其他东西吗?

我在 listView 中有 7 个这样的小部件,所以我相信她最多应该有 7 个。

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPersistentFrameCallback((timeStamp) async {
    print(' Is callback done?');
      if (mounted) {
        setState(() {
          isLoaded = true;
        });
      }
    });
  }

小部件本身非常简单,只有一个文本小部件

  @override
  Widget build(BuildContext context) {
    return Text('Hello');
   );
  }

在我的日志中,我看到以下内容不断上升。

【问题讨论】:

  • 正如您现在所意识到的,问题出在 addPersistentFrameCallback() 上,它在应用程序的生命周期内为每一帧一遍又一遍地调用回调。解决方法是用 addPostFrameCallback() 代替。但是您仍然可能需要考虑其他方法。例如:stackoverflow.com/a/61075285/3135317
  • @paulsm4 感谢您的建议,但出于各种原因,我故意选择不为此应用程序使用基于反应/流的方法。如果我没有,这将是一个很好的建议,所以我感谢您抽出宝贵时间发表评论。

标签: flutter dart


【解决方案1】:

也许你想要addPostFrameCallback 而不是addPersistentFrameCallback

根据文档addPersistentFrameCallback

一旦注册,它们会在应用程序的生命周期内为每一帧调用。

根据文档addPostFrameCallback

后帧回调不能取消注册。它们只被调用一次。

【讨论】:

  • 这引出了一个问题,为什么 OP 认为他们需要任何回调?我也不愿意调用“setState()”而不是“initState()”。目标是什么,他/她想要完成什么?很可能有一种更简单/更有效的方法来做到这一点......
  • 哦,伙计,当您在 IDE 中使用 autoComplete 时会发生这种情况。感谢您指出了这一点。为了回答@paulsm4 的问题,我正在从 Firestore 中检索信息以填充我的小部件。我在最后调用了 setState 来用数据刷新小部件。
  • 我刚刚更新了我的代码,它已经修复了。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多