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

Flutter中使用contacts_service更新联系人异常:电话号码被移除

问题解决:使用contacts_service更新联系人后电话号码消失

可能的原因及修复方案:

  • 处理后号码为空:检查modifyBeninNumber方法,确保返回的号码不为空字符串。如果处理后号码无效,应保留原号码,避免系统自动移除空号码条目。
  • 异步更新未等待:ContactsService.updateContact是异步方法,同步调用会导致更新未完成就执行后续逻辑,引发状态异常。需用async/await确保更新完成。
  • 联系人标识不可靠:更新必须依赖唯一的identifier,不能用displayName替代(重名联系人会导致更新错误),必须保证contact.identifier不为空。
  • 对象引用问题:直接修改原contact对象可能导致数据源异常,建议复制对象后再修改更新。

修改后的代码:

Future<void> _updateSelectedContacts() async {
  // 先更新选中状态,避免重复操作
  setState(() {
    selectedContacts.updateAll((key, value) => false);
    _selectAll = false;
  });

  for (var contact in contacts) {
    final id = contact.identifier;
    // 仅处理有有效标识且被选中的联系人
    if (id == null || selectedContacts[id] != true) continue;

    final updatedPhones = contact.phones?.map((phone) {
      final originalNumber = phone.value ?? "";
      final modifiedNumber = modifyBeninNumber(originalNumber);
      // 确保号码非空,否则保留原号码
      return Item(label: phone.label, value: modifiedNumber.isNotEmpty ? modifiedNumber : originalNumber);
    }).toList();

    if (updatedPhones != null && updatedPhones.isNotEmpty) {
      // 复制联系人对象,避免修改原数据源
      final updatedContact = Contact.fromMap(contact.toMap());
      updatedContact.phones = updatedPhones;
      print('Updating contact: ${updatedContact.displayName}');
      // 等待更新操作完成
      await ContactsService.updateContact(updatedContact);
    }
  }

  if (mounted) {
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(content: Text('Contacts updated successfully!')),
    );
  }
}

额外注意事项:

  • 权限验证:确保已申请并获取WRITE_CONTACTS权限,Android 13及以上机型还需确认POST_NOTIFICATIONS权限是否正常获取。
  • 边界测试:针对无电话号码、处理后号码为空的场景做测试,避免出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:52:34