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

Flutter调用setState后FutureBuilder仍未更新UI问题求助

你的代码存在两处核心错误导致UI无法刷新:

  • onRefresh回调的写法错误:你使用的then((value) => (value){...}语法实际是用箭头函数返回了一个未执行的匿名函数,内部更新数据、调用setState的逻辑全程没有运行。
  • FutureBuilder的future参数绑定逻辑错误:FutureBuilder只会在首次构建组件时执行一次传入的future,后续你修改listDummy的值也不会触发它重新请求最新数据。

修复方案

直接参考下方修改后的代码即可,改用async/await写法替代嵌套回调,同时调整FutureBuilder的future参数逻辑,确保刷新后能拿到最新数据:

return RefreshIndicator(
  onRefresh: () async {
    await dataLoader.loadOnlineClass();
    // 刷新本地缓存数据
    listDummy = PersistenceHelper().getOnlineClass();
    setState(() {});
  },
  child: FutureBuilder(
    // 每次组件重新build时重新执行请求,拿到最新数据
    future: PersistenceHelper().getOnlineClass(),
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.waiting:
          return const Text('Loading....');
        default:
          if (snapshot.hasError) {
            return Text('Error: ${snapshot.error}');
          } else {
            return _listShowerTest(snapshot.data);
          }
      }
    },
  ),
);

优化建议

如果想要避免每次组件build都重复执行数据请求,可以去掉FutureBuilder,直接把列表数据存在List类型的状态变量中,用状态变量直接渲染列表,下拉刷新时直接更新这个状态变量再调用setState即可,性能更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 21:36:07