Flutter校验本地通讯录号码是否存在于服务端列表始终返回false如何解决
问题根因
- 你当前的
serverContacts列表中存储的是服务端返回的对象实例,但List.contains会直接判断元素是否完全相等,对象和字符串永远不可能匹配成功,所以判断结果永远为false。 - 额外潜在问题:本地通讯录的手机号格式和服务端存储的格式可能存在差异,比如是否带国家码、是否带有空格/横杠/括号等分隔符,也会导致匹配失败。
解决建议
1. 预处理服务端数据,提取手机号为独立集合
提前把服务端所有手机号提取出来存入Set,匹配效率更高,也避免每次渲染都遍历对象列表:
// 手机号标准化工具方法:去掉所有非数字字符,可根据业务需求调整是否保留国家码前缀 String standardizePhone(String phone) { return phone.replaceAll(RegExp(r'[^0-9]'), ''); } // 初始化时预处理服务端数据,把所有手机号标准化后存入Set Set<String> serverPhoneSet = serverContacts.map((item) => standardizePhone(item.phone.toString())).toSet();
2. 修正匹配逻辑
// 修正后的trailing属性配置 trailing: () { // 先处理本地联系人无手机号的边界情况 if (contact.phones == null || contact.phones!.isEmpty) { return TextButton( child: Icon(Icons.sms, color: Colors.grey[400],), onPressed: () {}, ); } // 标准化本地手机号后匹配 String localPhone = standardizePhone(contact.phones!.elementAt(0).value!); bool isMatched = serverPhoneSet.contains(localPhone); return isMatched ? TextButton( child: Icon(Icons.chat, color: Colors.grey[600],), onPressed: () {}, ) : TextButton( child: Icon(Icons.sms, color: Colors.grey[400],), onPressed: () {}, ); }()
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

