Flutter联系人管理插件at_contact的使用
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
更多关于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可能会随着版本的更新而有所变化,因此建议查阅最新的官方文档以获取最准确的信息。