Flutter中ContactsService.getContacts()获取联系人速度过慢怎么优化?
Flutter 获取安卓联系人加载过慢优化方案
你当前使用的全量拉取逻辑默认会加载联系人所有字段数据,是耗时高的核心原因,可通过以下方案优化:
核心优化措施
按需拉取字段,关闭不必要的信息返回
默认ContactsService.getContacts()会返回头像、邮箱、地址、社交账号等全量字段,大部分场景下不需要的字段直接关闭即可大幅降低耗时,其中头像拉取是耗时最高的项,不需要展示头像的话优先关闭:getContacts() async { var contacts = await ContactsService.getContacts( withThumbnails: false, // 关闭头像缩略图拉取,优化幅度最大 withEmails: false, withAddresses: false, withOrganizations: false, withPhones: true, // 仅保留你业务需要的字段开关 // 其他不需要的字段统一设为false ); setState(() { _contacts = contacts; }); }去掉冗余调试逻辑
你当前代码里的print("Contact List " + contacts.toList().toString());会将全量联系人序列化为字符串,联系人数量多的情况下会额外增加数百毫秒耗时,正式环境务必删除该类逻辑。分页懒加载避免一次性拉取全量
如果联系人数量过千,建议使用分页参数分段拉取,先渲染第一页数据给用户,后续列表滚动时再加载剩余内容:// 首次加载拉取前20条 var firstBatch = await ContactsService.getContacts( limit: 20, offset: 0, // 加上上面的字段过滤参数 ); // 列表滚动到底部时加载下一页,offset累加对应数值即可 var nextBatch = await ContactsService.getContacts( limit: 20, offset: 20, );增加缓存降低重复拉取耗时
若业务不需要每次都加载最新联系人,可以将拉取到的联系人数据缓存到本地(如用Isar、SharedPreferences存储),下次进入页面时优先渲染缓存数据,后台异步拉取最新数据更新,用户无感知等待。提前触发加载+加载态提示
把联系人拉取逻辑提前到页面初始化阶段触发,不要等用户交互后才开始加载,拉取过程中展示加载弹窗/骨架屏,避免用户以为页面卡顿。
内容的提问来源于stack exchange,提问作者user16647221-SIMJEC
相关产品推荐
相关产品推荐

