Flutter使用contacts_service插件通讯录搜索联系号码匹配不全如何修复
问题根因
contacts_service返回的contact.phones列表中每个元素是Phone实体类,原代码直接将Phone实例传入flattenPhoneNumber做处理,没有读取实际存储手机号的value属性,导致号码匹配逻辑完全失效- 未处理搜索框清空的场景,清空搜索词后联系人列表不会重置
修复后代码
// 通用手机号格式化方法:移除所有非数字字符,忽略国家码、分隔符等干扰内容 String flattenPhoneNumber(String phoneStr) { return phoneStr.replaceAll(RegExp(r'[^0-9]'), ''); } filterContacts() { setState(() { List<Contact> _contacts = []; _contacts.addAll(contacts); if (searchController.text.isNotEmpty) { String searchTerm = searchController.text.toLowerCase().trim(); String searchTermFlatten = flattenPhoneNumber(searchTerm); _contacts.retainWhere((contact) { // 名称匹配逻辑 String contactName = contact.displayName?.toLowerCase() ?? ''; if (contactName.contains(searchTerm)) { return true; } if (searchTermFlatten.isEmpty) { return false; } // 号码匹配逻辑:修正为读取Phone对象的value属性 var matchedPhone = contact.phones.firstWhere((phn) { String phnFlattened = flattenPhoneNumber(phn.value ?? ''); return phnFlattened.contains(searchTermFlatten); }, orElse: () => null); return matchedPhone != null; }); contactsFiltered = _contacts; } else { // 搜索词为空时展示全量联系人 contactsFiltered = List.from(contacts); } }); }
关键修改说明
- 修正号码取值:将原本传入
flattenPhoneNumber的phn实例改为phn.value ?? '',正确获取手机号字符串 - 增加空安全处理:给
displayName、value都增加了空值兜底,避免空指针异常 - 补充搜索清空逻辑:搜索框无内容时直接返回全量联系人,符合常规搜索交互
- 优化变量作用域:将
searchTerm、searchTermFlatten的声明移到retainWhere外部,避免重复计算,提升性能
内容的提问来源于stack exchange,提问作者Mohamed Hussein
相关产品推荐
相关产品推荐

