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

Flutter调用API实现动态ExpansionPanelList展开后自动闭合问题求助

问题根因

核心问题是你把API请求方法_fetchJobs()直接写在了FutureBuilder的future参数中,每次当前widget触发build的时候,都会重新执行一次API请求,等请求返回后,新拿到的Job列表实例里的isExpanded字段都是默认的false,所以面板就会自动收起。
你点击展开面板的时候调用了setState,自然会触发整个widget重绘,刚好命中了上述逻辑,等接口请求返回后面板就自动关闭了。

修复步骤

1. 在State类中新增两个存储变量

class _ExpansionListState extends State<ExpansionList> {
  // 新增以下两个变量
  late Future<List<Job>> _jobsFuture;
  List<Job>? _jobsList;

2. 在initState中初始化请求,保证只执行一次

@override
void initState() {
  super.initState();
  _jobsFuture = _fetchJobs();
}

3. 调整FutureBuilder逻辑,复用本地存储的请求结果

Widget build(BuildContext context) {
  return FutureBuilder<List<Job>>(
    // 替换为提前初始化好的Future变量,不要直接传_fetchJobs()
    future: _jobsFuture,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
      if (snapshot.hasData) {
        // 首次请求成功后把数据存到本地变量,不要每次都用snapshot的临时数据
        _jobsList ??= snapshot.data as List<Job>;
        return Column(
          children: [
            _jobsListView(_jobsList, context),
          ],
        );
      } else if (snapshot.hasError) {
        return Text("${snapshot.error}");
      }
      return const CircularProgressIndicator();
    },
  );
}

4. 可选检查

确认你的Job类里的isExpanded字段没有被定义为final,保证状态可修改。

改完后API请求只会在页面初始化时执行一次,点击展开触发重绘时不会再重复发起请求,展开状态也会正常保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:00:06