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
相关产品推荐
相关产品推荐

