如何在Flutter中优化API子查询,提升关联数据加载速度?
优化Flutter异步API请求性能的可行方案
后端层面优化
- 改造为批量查询接口
别让前端逐个发请求查关联数据,后端新增批量查询接口。前端把需要查的所有ID一次性传过去,后端用Sequelize的findAll配合where: { id: [...ids] }批量拉取关联表数据,一次请求返回所有对应名称。比如给某个关联表加POST /api/related-table/batch接口,接收ids数组,返回id和名称的映射集合。 - 预加载关联数据
查询materials_requisitions的时候,用Sequelize的include选项直接关联查询需要的表,把关联的可读名称一起返回给前端。这样前端拿到数据就能直接用,不用再发额外请求。示例代码:const requisitions = await MaterialsRequisition.findAll({ include: [ { model: Supplier, attributes: ['id', 'supplier_name'] }, { model: Material, attributes: ['id', 'material_name'] } // 按需添加其他关联表 ] }); - 缓存高频静态数据
对于不常变动的关联字典表,后端用Redis或者内存缓存查询结果,下次请求直接返回缓存,减少数据库查询耗时。
前端层面优化
- 并行发起请求而非串行等待
如果暂时没法改后端,别逐个循环等每个请求完成,用Future.wait()同时发起所有异步请求。示例代码:
这样总耗时是最慢的那个请求的时间,而非所有请求时间相加。// 待查询的关联ID列表 List<String> relatedIds = reqData.map((item) => item.relatedId).toList(); // 生成所有请求的Future列表 List<Future<String>> nameFutures = relatedIds.map((id) => fetchRelatedName(id)).toList(); // 并行等待所有请求完成 List<String> names = await Future.wait(nameFutures); - 本地缓存已查询数据
前端把查过的关联ID和对应名称存在本地(比如SharedPreferences、Hive),下次遇到相同ID直接从缓存取,不用重复发请求。示例代码:final Map<String, String> _relatedNameCache = {}; Future<String> getRelatedName(String id) async { if (_relatedNameCache.containsKey(id)) { return _relatedNameCache[id]!; } final name = await ApiClient.fetchRelatedName(id); _relatedNameCache[id] = name; return name; } - 分页+懒加载优化
如果materials_requisitions数据量很大,别一次性加载所有数据,分页加载。并且每个条目的关联名称,等滚动到可见区域时再发起请求(懒加载),避免一次性发起大量请求阻塞页面。
前后端配合进阶方案
- 改用GraphQL替代REST
换成GraphQL接口,前端可以精确指定需要的字段和关联数据,一次请求就能拿到所有materials_requisitions和对应的可读名称,彻底避免多次REST请求。Sequelize能很好配合GraphQL解析器实现关联查询。 - 返回扁平化数据结构
后端返回数据时,把关联表的名称直接扁平嵌入materials_requisitions的字段里,比如返回{ id: 101, supplier_name: "XX供应商", material_name: "XX原料", ... },前端直接使用,不用处理嵌套结构或额外请求。
内容的提问来源于stack exchange,提问作者Sistemas Kolbasiuk
相关产品推荐
相关产品推荐

