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

