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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:39:05