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

Flutter API拉取生成ListView卡顿,求性能优化方案

优化ListView加载缓慢的解决方案

你的问题核心在于每次构建ListView item时都重复计算测试得分——itemBuilder会随着列表滚动被频繁调用,每次都遍历allTests['Test $i']的所有条目统计答对题数,这会带来大量重复计算,直接拖慢UI加载速度。

优化思路:提前预处理所有结果

在数据加载完成后(比如initState阶段、allTests赋值完成后),一次性计算所有测试的得分和通过状态,存储到一个单独的列表中。后续itemBuilder只需要直接读取预处理好的数据,无需重复计算。

具体代码修改

  1. 先定义一个存储预处理结果的列表:
List<Map<String, dynamic>> testResults = [];
  1. 添加计算结果的方法,在数据就绪后调用:
void computeAllTestResults() {
  testResults.clear();
  for (int i = 0; i < No_of_tests; i++) {
    // 取出当前测试的所有题目数据
    final testQuestions = allTests['Test $i']!;
    // 统计答对题数(省去toList(),直接取length更高效)
    final correctCount = testQuestions.entries
        .where((entry) => entry.value['ans'] == entry.value['yourAns'])
        .length;
    // 计算得分
    final score = (correctCount / totalquestions) * 100;
    // 判断是否通过
    final status = score >= 80 ? 'Passed' : 'Failed';
    // 存入结果列表
    testResults.add({'score': score, 'status': status});
  }
}
  1. 修改ListView.builder,直接读取预处理结果:
ListView.builder(
  itemCount: No_of_tests,
  itemBuilder: (BuildContext context, int i) {
    final result = testResults[i];
    return Text('${result['score']} - ${result['status']}');
  },
)

额外优化建议

  • 如果totalquestions是每个测试单独的总题数,记得把它也提前存入testResults,避免在计算时重复获取。
  • 如果allTests数据量极大,可以把计算逻辑放到异步任务中(比如用compute函数),避免阻塞UI线程导致卡顿。
  • 确保Text组件没有不必要的重绘,比如用const修饰(如果内容固定的话),减少无意义的UI重建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:42:12