You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter addPersistentFrameCallback无限循环原因及单次构建后回调方案咨询

问题原因

  • 你调用的WidgetsBinding.instance.addPersistentFrameCallback本身就是持久帧回调,不是单次触发:只要应用触发新的帧绘制,你注册的这个回调就会被执行一次,不会自动注销。
  • 你在回调内部执行了setState操作,setState会触发当前Widget重绘,进而触发新的帧绘制,新帧又会执行你提前注册的持久回调,回调再次执行setState,就形成了无限循环。你一共在7个Widget中注册了该回调,所以每生成一帧就会打印7次日志,总次数自然会持续上涨。

单次构建后回调的解决方案

你应该使用addPostFrameCallback,该回调是单次触发的,执行完成后会自动销毁,不会重复响应后续帧绘制事件。
修正后的initState代码如下:

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

补充说明:如果你的逻辑不需要依赖Flutter绘制完成的时机,只是想在Widget初始化后执行一次异步操作,直接在initState里包裹Future.microtask执行对应逻辑即可,不需要依赖帧回调。

内容的提问来源于stack exchange,提问作者Yonkee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:36:04