Flutter SliverAppBar的onStretchTrigger调用setState报Build scheduled during frame错误
问题原因
onStretchTrigger回调的执行时机正处于Flutter当前帧的布局/绘制流程中,此时直接调用setState会触发新一轮的部件重建,和正在进行的帧绘制流程冲突,所以抛出了Build scheduled during frame错误。而RefreshIndicator、按钮点击的回调执行时机是在当前帧绘制完成之后,所以不会触发冲突。
解决方案
方案1:使用帧后回调执行状态更新
借助SchedulerBinding的addPostFrameCallback将setState逻辑调度到当前帧全部绘制完成后再执行,代码修改如下:
import 'package:flutter/scheduler.dart'; // ... 其他代码 onStretchTrigger: () async { SchedulerBinding.instance.addPostFrameCallback((_) { setState(() { myVariable = myFutureData(); }); }); },
方案2:用零延迟Future包裹
也可以用Future.delayed(Duration.zero)实现等效效果,逻辑会自动被调度到当前帧结束后执行:
onStretchTrigger: () async { await Future.delayed(Duration.zero); setState(() { myVariable = myFutureData(); }); },
额外优化建议
如果myFutureData()是异步请求逻辑,建议先await拿到返回结果再更新状态,避免myVariable被赋值为Future类型导致后续使用异常,示例如下:
onStretchTrigger: () async { final result = await myFutureData(); SchedulerBinding.instance.addPostFrameCallback((_) { setState(() { myVariable = result; }); }); },
内容的提问来源于stack exchange,提问作者Bermjly Team
相关产品推荐
相关产品推荐

