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

Flutter_contacts联系人更新函数:手机号匹配及代码优化求助

问题修复与代码优化方案

原代码核心问题分析

  1. 手机号匹配失效原因:
    • 原代码直接将Phone对象存入列表,而非提取号码字符串,导致字符串与对象的匹配永远不成立。
    • 逻辑错误:无论联系人是否有手机号,都会向列表添加空字符串,导致手机号列表长度与ID、名称列表不一致,索引对应完全混乱。
  2. 效率问题:
    • 三次遍历联系人列表分别存储ID、名称、号码,冗余操作多。
    • 找到匹配项后再次调用getContact获取详情,额外增加API调用开销。

优化后的完整代码

import 'package:flutter_contacts/flutter_contacts.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';

Future updateContactOnPhone(
  String name,
  String surname,
  String cellnumber,
  String email,
  String photo,
) async {
  final targetDisplayName = '$name $surname';
  final targetPhoneNumber = cellnumber.trim();
  Uint8List? photoBytes;

  // 加载照片并处理异常
  try {
    photoBytes = (await NetworkAssetBundle(Uri.parse(photo)).load(photo))
        .buffer
        .asUint8List();
  } catch (e) {
    print('照片加载失败: $e');
  }

  if (await FlutterContacts.requestPermission()) {
    // 获取带联系方式的联系人,减少不必要的数据加载
    final contacts = await FlutterContacts.getContacts(withProperties: true);
    Contact? matchedContact;

    // 单次遍历完成两种匹配逻辑
    for (final contact in contacts) {
      // 优先匹配显示名称
      if (contact.displayName == targetDisplayName) {
        matchedContact = contact;
        break;
      }

      // 遍历联系人所有手机号进行匹配
      if (contact.phones != null) {
        for (final phone in contact.phones!) {
          // 同时支持原始号码和标准化号码匹配,兼容不同格式
          if (phone.number == targetPhoneNumber || phone.normalizedNumber == targetPhoneNumber) {
            matchedContact = contact;
            break;
          }
        }
        if (matchedContact != null) break;
      }
    }

    if (matchedContact != null) {
      // 更新已有联系人
      matchedContact.name.first = name;
      matchedContact.name.last = surname;
      matchedContact.phones = [Phone(targetPhoneNumber)];
      matchedContact.emails = [Email(email)];
      if (photoBytes != null) matchedContact.photo = photoBytes;
      await matchedContact.update();
    } else {
      // 创建新联系人
      final newContact = Contact()
        ..name.first = name
        ..name.last = surname
        ..phones = [Phone(targetPhoneNumber)]
        ..emails = [Email(email)]
        ..photo = photoBytes;
      await newContact.insert();
    }
  }
}

关键改进说明

  • 修复手机号匹配:

    • 提取Phone对象中的number或normalizedNumber(自动处理区号、空格等格式差异)作为匹配依据。
    • 遍历联系人的所有手机号,避免只检查第一个号码导致的遗漏。
    • 移除错误的空字符串添加逻辑,保证匹配逻辑准确。
  • 大幅提升效率:

    • 仅遍历一次联系人列表,同时完成名称和手机号的匹配检查。
    • 直接使用遍历过程中获取的Contact对象进行更新,无需二次调用API获取详情。
    • 用withProperties: true指定只加载必要属性,减少内存占用和加载耗时。
  • 鲁棒性增强:

    • 给照片加载添加异常捕获,避免因图片资源问题导致函数崩溃。
    • 对手机号做trim()处理,过滤前后空格,提升匹配成功率。

内容的提问来源于stack exchange,提问作者Yury_X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:25:19