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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:05