Flutter联系人管理插件at_contact的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter联系人管理插件at_contact的使用

Overview

at_contact 是为Flutter开发者设计的一个包,用于在他们的atPlatform应用中持久化联系人。这个库提供了添加、更新和删除atPlatform上的联系人的功能。

该开源包是用Dart编写的,支持Flutter,并遵循了atPlatform的去中心化边缘计算模型,具有以下特点:

  • 通过个人数据存储对数据访问进行加密控制
  • 不需要应用程序后端
  • 端到端加密,只有数据所有者拥有密钥
  • 私密且无监控的连接

我们称之为“翻转互联网”,即让用户控制对其数据的访问权限,您可以通过阅读概览了解更多关于它是如何工作的信息。

Get Started

1. Clone it from GitHub

您可以从 GitHub repo 克隆源代码。

$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY

2. Manually add the package to a project

有关如何手动将此包添加到项目中的说明,请参见 pub.dev 这里

How it works

Setup

安装包:

$ dart pub add at_contact

Usage

创建 AtContactsImpl 实例

// Create an instance of AtClient.
AtClient atClientInstance = AtClientManager.getInstance().atClient;

// Create an instance of AtContactsImpl.
// It takes 2 positional arguments called AtClient and atSign.
// One optional argument called regexType.
AtContactsImpl _atContact = AtContactsImpl(atClientInstance, atClientInstance.getCurrentAtSign());

Contacts

添加联系人
Future<void> _addContact() async {
    // Pass the user input data to respective fields of AtContact.
    AtContact contact = AtContact()
    ..atSign = atSign
    ..createdOn = DateTime.now()
    ..favourite = _isFavouriteSelected
    ..type = ContactType.Individual;
    bool isContactAdded = await _atContact.add(contact);
    print(isContactAdded ? 'Contact added successfully' : 'Failed to add contact');
}
获取联系人详情
AtContact? userContact;

@override
Future<void> _getContactDetails() async {
    // Optionally pass the atKeys.
    AtContact? _contact = await _atContact.get(atSign);
    if(_contact == null){
        print("Failed to fetch contact data.");
    } else {
        setState(() => userContact = _contact);
    }
}
删除联系人

可以使用 delete()deleteContact() 函数实现删除联系人功能。

使用 delete() 函数:

Future<void> _deleteContact(String _atSign) async {
    if(_atSign == null || _atSign.isEmpty){
        print("AtSign was't passed or empty.");
    } else {
        bool _isContactDeleted = await _atContact.delete(_atSign);
        print(_isContactDeleted ? 'Contact deleted successfully' : 'Failed to delete contact.');
    }
}

使用 deleteContact() 函数:

Future<void> _deleteContact(AtContact _contact) async {
    bool _isContactDeleted = await _atContact.deleteContact(_contact);
    print(_isContactDeleted ? 'Contact deleted successfully' : 'Failed to delete contact.');
}
显示用户联系人列表
List<AtContact> contactsList = await _atContact.listContacts();
列出用户收藏的联系人
Future<void> _listFavoriteContacts() async {
    List<AtContact> _favContactsList = await _atContact.listFavoriteContacts();
    if(_favContactsList.isEmpty){
        print("No favorite contacts found");
    } else {
        setState(() => favContactsList = _favContactsList);
    }
}

Groups

创建群组
AtGroup myGroup = AtGroup('The atPlatform team')
    ..createdBy = _myAtSign
    ..createdOn = DateTime.now()
    ..description = 'Team with awesome spirit'
    ..updatedOn = DateTime.now()
    ..groupId = 'T@PT101'
    ..displayName = 'at_contact team';

Future<void> _createGroup(AtGroup group) async {
    AtGroup? myGroup = await _atContact.createGroup(group);
    if(myGroup == null){
        print('Failed to create group');
    } else {
        print('${group.id} has been created successfully');
    }
}
更新群组
Future<void> _updateGroup(AtGroup group) async {
    try{
        AtGroup? myGroup = await _atContact.updateGroup(group);
        if(myGroup == null){
            print('Failed to update group');
        } else {
            print('${group.id} has been updated successfully');
        }
    } catch(e){
        if(e is GroupNotExistsException){
            print('Group not exists. Please create the group first.');
        } else {
            print('Failed to update group');
        }
    }
}
获取群组详情
String myGroupId = 'T@PT101';

Future<void> _getGroup(String groupId) async {
    AtGroup? myGroup = await _atContact.getGroup(groupId);
    if(myGroup == null){
        print('Failed to get group details');
    } else {
        print('Group Name: ${myGroup.groupName}\n'
              'Group ID : ${myGroup.groupId}\n'
              'Created by : ${myGroup.createdBy}\n'
              'Created on : ${myGroup.createdOn}');
    }
}
删除群组
Future<void> _deleteGroup(AtGroup groupName) async {
    AtGroup? _myGroup = await _atContact.getGroup(groupName);
    if(_myGroup == null){
        print('Failed to get group details');
    } else {
        bool _isGroupDeleted = await _atContact.deleteGroup(_myGroup);
        print(_isGroupDeleted ? '${_myGroup.groupName} group deleted' : 'Failed to delete group');
    }
}
列出群组名称
Future<void> _listGroupNames() async {
    List<String?> _groupNames = await _atContact.listGroupNames();
    if(_groupNames.isEmpty){
        print('No groups found');
    } else {
        for(String _groupName in _groupNames){
            print(_groupName);
        }
    }
}
列出群组ID
Future<void> _listGroupIds() async {
    List<String?> _groupIds = await _atContact.listGroupIds();
    if(_groupIds == null){
        print('No groups found');
    } else {
        for(String _groupId in _groupIds){
            print(_groupId);
        }
    }
}
向群组添加成员
Set<AtContact> selectedContacts = <AtContact>{};

for(String _atSign in selectedAtSignsList){
    AtContact? _fetchedContact = await _atContact.get(_atSign);
    if(_fetchedContact != null){
        selectedContacts.add(_fetchedContact);
    } else{
        print('Failed to get contact for $_atSign');
    }
}

AtGroup? _myGroup = await _atContact.getGroup(myGroupID);

Future<void> _addMembers(Set<AtContact> contacts, AtGroup group) async {
    bool _isMembersAdded = await _atContact.addMembers(contacts, group);
    print(_isMembersAdded ? 'Members added to the group' : 'Failed to add members to the group');
}
从群组中删除成员
Set<AtContact> selectedContacts = <AtContact>{};

for(String _atSign in selectedAtSignsList){
    AtContact? _fetchedContact = await _atContact.get(_atSign);
    if(_fetchedContact != null){
        selectedContacts.add(_fetchedContact);
    } else{
        print('Failed to get contact for $_atSign');
    }
}

AtGroup? _myGroup = await _atContact.getGroup(myGroupID);

Future<void> _deleteMembers(Set<AtContact> contacts, AtGroup group) async {
    bool _isMembersRemoved = await _atContact.deleteMembers(contacts, group);
    print(_isMembersRemoved ? 'Member removed from the group' : 'Failed to remove member from the group');
}
检查用户是否为群组成员
AtContact? _userContact = await _atContact.get(atSign);
bool isAMember = await _atContact.isMember(_userContact, myGroup);
print('$atSign is ${isAMember ? '' : 'not'} a member of ${myGroup.groupName}');

Additional content

我们已经开发了一些实时应用程序,如 @mosphere-pro@buzz、[@rrive (Google play store)](https://play.google.com/store/apps/details?id=com.atsign.arrive) / [@rrive (App Store)](https://apps.apple.com/in/app/rrive/id1542050548),使用了这个库。

Flutter版本的实现可以在at_contacts_flutter包中找到。

Open source usage and contributions

这是开源代码,所以您可以自由使用它,建议更改或增强,或者创建自己的版本。请参阅CONTRIBUTING.md以获取有关设置工具、测试和提交拉取请求的详细指导。


更多关于Flutter联系人管理插件at_contact的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter联系人管理插件at_contact的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


关于Flutter中的联系人管理插件at_contact的使用,下面是一个基本示例,展示了如何集成和使用该插件来访问和管理设备上的联系人。请确保您已经按照at_contact插件的官方文档完成了基本的项目设置和依赖项添加。

首先,确保在pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  at_contact: ^最新版本号 # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,在您的Flutter项目中,您可以按照以下步骤使用at_contact插件:

1. 导入插件

在需要使用联系人的Dart文件中导入插件:

import 'package:at_contact/at_contact.dart';
import 'package:flutter/material.dart';

2. 请求权限

在访问联系人之前,您需要请求必要的权限。这通常是在应用的启动过程中完成的,或者在用户尝试访问联系人之前。以下是一个简单的权限请求示例:

Future<void> requestPermissions() async {
  bool hasPermission = await Permission.contacts.status.isGranted;
  if (!hasPermission) {
    Map<Permission, PermissionStatus> permissions = await [
      Permission.contacts,
    ].request();

    if (permissions[Permission.contacts]?.isGranted ?? false) {
      hasPermission = true;
    }
  }

  if (!hasPermission) {
    // 处理权限被拒绝的情况
    throw Exception('联系人权限被拒绝');
  }
}

注意:permission_handler插件用于处理权限请求,您需要在pubspec.yaml中添加该依赖,并相应地处理权限请求结果。

3. 获取联系人

一旦获得权限,您可以使用at_contact插件来获取联系人列表:

Future<List<Contact>> fetchContacts() async {
  try {
    await requestPermissions(); // 确保先请求权限

    // 使用at_contact插件获取联系人
    List<Contact> contacts = await ContactService().getContacts();
    return contacts;
  } catch (e) {
    // 处理异常,例如权限被拒绝或其他错误
    print('获取联系人失败: $e');
    return [];
  }
}

4. 显示联系人

最后,您可以在UI中显示获取到的联系人信息。以下是一个简单的示例,展示如何在Flutter应用中显示联系人姓名和电话号码:

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Contact> contacts = [];

  @override
  void initState() {
    super.initState();
    fetchContacts().then((result) {
      setState(() {
        contacts = result;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('联系人列表'),
        ),
        body: contacts.isEmpty
            ? Center(child: CircularProgressIndicator())
            : ListView.builder(
                itemCount: contacts.length,
                itemBuilder: (context, index) {
                  Contact contact = contacts[index];
                  String displayName = contact.displayName ?? '';
                  List<PhoneNumber> phoneNumbers = contact.phoneNumbers ?? [];
                  String phoneNumber = phoneNumbers.isNotEmpty
                      ? phoneNumbers.first.value
                      : '未知';

                  return ListTile(
                    title: Text(displayName),
                    subtitle: Text(phoneNumber),
                  );
                },
              ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它请求联系人权限,获取联系人列表,并在UI中显示每个联系人的姓名和第一个电话号码。

请注意,at_contact插件的具体API可能会随着版本的更新而有所变化,因此建议查阅最新的官方文档以获取最准确的信息。

回到顶部