我对flutter/dart并不熟悉,我在Flutterflow中工作,尝试创建一个自定义函数,该函数将应用中联系人的相关数据(姓名、手机号码、电子邮件、照片)作为输入,然后使用以下逻辑在用户的手机中更新/创建该联系人:
1.如果用户有同名(displayName)的联系人,则会更新此联系人
1.如果用户有一个具有相同电话号码的联系人,则会更新此联系人
1.如果之前没有基于两个参数的匹配,则创建新联系人
到目前为止,我只创建了一个函数,该函数检查displayName匹配,如果存在匹配则更新contact,如果不存在匹配,它创建了一个新的联系人。但是我不知道如何做手机号码匹配/更新部分(在我的代码中不起作用).我搜索要更新的正确联系人的方法是使用联系人列表搜索联系人ID姓名和联系人的ID来索引正确的ID。这可能是一个非常丑陋和低效的方法,但我不知道其他方法。
如果有人能就联系人搜索/更新部分和整体代码优化给予建议,我将非常高兴(因为我认为我的方法既长又低效)。谢谢!
我的代码如下:
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 {
String searchingParameterName = name + " " + surname;
String searchingParameterCellphone = cellnumber;
List<String> phoneContactsIDs = [];
List<String> phoneContactsNames = [];
List<String> phoneContactsNumbers = [];
Uint8List bytes = (await NetworkAssetBundle(Uri.parse(photo)).load(photo))
.buffer
.asUint8List();
if (await FlutterContacts.requestPermission()) {
List<dynamic> contacts = await FlutterContacts.getContacts();
contacts.forEach((contact) {phoneContactsIDs.add(contact.id);});
contacts.forEach((contact) {phoneContactsNames.add(contact.displayName);});
contacts.forEach((contact) {if (contact.phones != null) {
phoneContactsNumbers.add(contact.phones.first);}
{phoneContactsNumbers.add("");}});
if (phoneContactsNames.contains(searchingParameterName)) {
int index = phoneContactsNames.indexOf(searchingParameterName);
String contactID = phoneContactsIDs.elementAt(index);
dynamic contact = await FlutterContacts.getContact(contactID);
contact.name.first = name;
contact.name.last = surname;
contact.phones = [Phone(cellnumber)];
contact.emails = [Email(email)];
await contact.update();
} else if (phoneContactsNumbers.contains(searchingParameterCellphone)) {
int index = phoneContactsNumbers.indexOf(searchingParameterCellphone);
String contactID = phoneContactsIDs.elementAt(index);
dynamic contact = await FlutterContacts.getContact(contactID);
contact.name.first = name;
contact.name.last = surname;
contact.phones = [Phone(cellnumber)];
contact.emails = [Email(email)];
await contact.update();
} else {
final newContact = Contact()
..name.first = name
..name.last = surname
..phones = [Phone(cellnumber)]
..emails = [Email(email)]
..photo = bytes;
await newContact.insert();
}}}
我尝试了代码的各种组合,并在论坛上搜索类似的示例,但都无济于事。
1条答案
按热度按时间siotufzp1#
这是您的代码的更新版本,它应该实现您描述的功能。我对您的代码做了一些更改,使其更有效,更易于阅读。
首先,我删除了phoneContactsNumbers列表并添加了phoneContacts列表,其中包含Contact对象而不是字符串。这允许我们直接从列表中访问联系人的displayName和电话,而不必在单独的列表中搜索它们。
接下来,我添加了一个matchContact()函数,该函数在phoneContacts列表中搜索具有指定displayName或phoneNumber的联系人。如果找到匹配项,该函数将返回匹配的联系人。否则,它将返回null。
最后,我更新了updateContactOnPhone()函数,以便使用matchContact()函数查找要更新的联系人,并使用Contact对象上的update()方法更新联系人的字段。我还添加了一个try-catch块来处理与联系人API交互时可能抛出的任何异常。
下面是更新后的代码:
我希望这对你有帮助!如果你有任何其他问题,请告诉我。