Flutter_contacts更新联系人功能

ztmd8pv5  于 2022-12-05  发布在  Flutter
关注(0)|答案(1)|浏览(262)

我对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();
    }}}

我尝试了代码的各种组合,并在论坛上搜索类似的示例,但都无济于事。

siotufzp

siotufzp1#

这是您的代码的更新版本,它应该实现您描述的功能。我对您的代码做了一些更改,使其更有效,更易于阅读。
首先,我删除了phoneContactsNumbers列表并添加了phoneContacts列表,其中包含Contact对象而不是字符串。这允许我们直接从列表中访问联系人的displayName和电话,而不必在单独的列表中搜索它们。
接下来,我添加了一个matchContact()函数,该函数在phoneContacts列表中搜索具有指定displayName或phoneNumber的联系人。如果找到匹配项,该函数将返回匹配的联系人。否则,它将返回null。
最后,我更新了updateContactOnPhone()函数,以便使用matchContact()函数查找要更新的联系人,并使用Contact对象上的update()方法更新联系人的字段。我还添加了一个try-catch块来处理与联系人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 {
  String displayName = name + " " + surname;
  String phoneNumber = cellnumber;
  List<Contact> phoneContacts = [];
  Uint8List bytes = (await NetworkAssetBundle(Uri.parse(photo)).load(photo))
      .buffer
      .asUint8List();

  if (await FlutterContacts.requestPermission()) {
    List<dynamic> contacts = await FlutterContacts.getContacts();
    phoneContacts = contacts.map((c) => Contact.fromMap(c)).toList();

    try {
      Contact contactToUpdate = matchContact(displayName, phoneNumber, phoneContacts);

      if (contactToUpdate == null) {
        final newContact = Contact()
          ..name.first = name
          ..name.last = surname
          ..phones = [Phone(cellnumber)]
          ..emails = [Email(email)]
          ..photo = bytes;
        await newContact.insert();
      } else {
        contactToUpdate.name.first = name;
        contactToUpdate.name.last = surname;
        contactToUpdate.phones = [Phone(cellnumber)];
        contactToUpdate.emails = [Email(email)];
        await contactToUpdate.update();
      }
    } catch (e) {
      print(e);
    }
  }
}

Contact matchContact(String displayName, String phoneNumber, List<Contact> contacts) {
  return contacts.firstWhere((c) => c.displayName == displayName || c.phones.contains(phoneNumber), orElse: () => null);
}

我希望这对你有帮助!如果你有任何其他问题,请告诉我。

相关问题