Flutter联系人管理插件flutter_contact的使用
Flutter联系人管理插件flutter_contact的使用
一个用于访问和管理设备原生联系人的Flutter插件。
使用
要使用此插件,需要在 pubspec.yaml 文件中添加 flutter_contact 依赖。例如:
dependencies:
    flutter_contact: ^0.6.1
权限
Android
在 AndroidManifest.xml 中添加以下权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
iOS
在 Info.plist 文件中设置 NSContactsUsageDescription:
<key>NSContactsUsageDescription</key>
<string>您的应用需要访问联系人信息。</string>
注意
flutter_contact 不处理请求和检查权限的过程。为了检查和请求用户访问联系人的权限,可以尝试使用以下插件:flutter_simple_permissions 或 permission_handler。
如果没有请求用户权限或权限未被授予,应用程序将失败。对于测试目的,您可以在设备上手动为您的测试应用设置权限。对于Android,进入 “设置” -> “应用” -> 选择您的测试应用 -> “权限” -> 然后打开 “联系人” 的开关。
统一与单个联系人
有两个主要的入口点:SingleContacts 和 UnifiedContacts。它们共享相同的API,并且大部分底层代码相同,但有以下区别:
SingleContacts将与每个平台上的未链接的原始联系人进行交互。UnifiedContacts将与每个平台上的已链接/聚合的联系人进行交互。
内存效率
该插件试图成为内存和CPU友好的。它不会将整个通讯录加载到内存中,而是提供一些更友好内存的方式迭代联系人:
流式处理
import 'package:flutter_contact/contact.dart';
// 默认情况下,这将使用每页20个联系人的方式遍历所有联系人。
await Contacts.streamContacts().forEach((contact) {
    print("${contact.displayName}"); // 打印联系人的显示名称
});
// 您可以手动调整缓冲区大小
Stream<Contact> contacts = await Contacts.streamContacts(bufferSize: 50);
分页列表
另一种选项是分页列表,它也使用底层的分页缓冲区,但不需要管理任何订阅,并且具有其他一些功能,如总数:
import 'package:flutter_contact/contact.dart';
final contacts = Contacts.listContacts();
final total = await contacts.length;
// 这将获取该联系人所属的页面,并返回该联系人
final contact = await contacts.get(total - 1);
while(await contacts.moveNext()) {
    final contact = await contacts.current;
}
示例
以下是一些使用 flutter_contact 插件的示例代码:
// 导入包
import 'package:flutter_contact/contact.dart';
// 获取设备上所有联系人作为流
Stream<Contact> contacts = await Contacts.streamContacts();
// 获取设备上所有不带缩略图的联系人(更快)
Iterable<Contact> contacts = await Contacts.streamContacts(withThumbnails: false);
// 获取匹配字符串的联系人
Stream<Contact> johns = await Contacts.streamContacts(query: "john");
// 添加联系人
// 联系人必须具有firstName / lastName才能成功添加
await Contacts.addContact(newContact);
// 删除联系人
// 联系人必须具有有效的标识符
await Contacts.deleteContact(contact);
// 更新联系人
// 联系人必须具有有效的标识符
await Contacts.updateContact(contact);
// 懒加载联系人头像数据而不将其缓存在联系人实例中
final contact = Contacts.getContact(contactId);
final Uint8List avatarData = await contact.getOrFetchAvatar();
完整示例
以下是一个完整的示例代码,展示了如何使用 flutter_contact 插件来请求权限并列出联系人:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_contact_example/people_list_page.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:logging/logger.dart';
import 'package:logging_config/logging_config.dart';
import 'package:permission_handler/permission_handler.dart';
import 'add_contact_page.dart';
void main() {
  configureLogging(LogConfig.root(Logger.level.INFO));
  runApp(ContactsExampleApp());
}
class ContactsExampleApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: <String, WidgetBuilder>{
        '/': (context) => const HomePage(),
        '/add': (BuildContext context) => AddContactPage(),
        '/contactsList': (BuildContext context) => PeopleListPage(),
      },
    );
  }
}
class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
  const HomePage();
}
class _HomePageState extends State<HomePage> {
  bool? _hasPermission;
  [@override](/user/override)
  void initState() {
    super.initState();
    _askPermissions();
  }
  Future<void> _askPermissions() async {
    PermissionStatus? permissionStatus;
    while (permissionStatus != PermissionStatus.granted) {
      try {
        permissionStatus = await _getContactPermission();
        if (permissionStatus != PermissionStatus.granted) {
          _hasPermission = false;
          _handleInvalidPermissions(permissionStatus);
        } else {
          _hasPermission = true;
        }
      } catch (e) {
        if (await showPlatformDialog(
                context: context,
                builder: (context) {
                  return PlatformAlertDialog(
                    title: Text('联系人权限'),
                    content: Text(
                        '我们无法获取权限。您想打开应用设置来修复吗?'),
                    actions: [
                      PlatformDialogAction(
                        onPressed: () {
                          Navigator.pop(context, false);
                        },
                        child: Text('关闭'),
                      ),
                      PlatformDialogAction(
                        onPressed: () {
                          Navigator.pop(context, true);
                        },
                        child: Text('设置'),
                      ),
                    ],
                  );
                }) ==
            true) {
          await openAppSettings();
        }
      }
    }
    await Navigator.of(context).pushReplacementNamed('/contactsList');
  }
  Future<PermissionStatus> _getContactPermission() async {
    final status = await Permission.contacts.status;
    if (!status.isGranted) {
      final result = await Permission.contacts.request();
      return result;
    } else {
      return status;
    }
  }
  void _handleInvalidPermissions(PermissionStatus permissionStatus) {
    if (permissionStatus == PermissionStatus.denied) {
      throw PlatformException(
          code: 'PERMISSION_DENIED',
          message: '访问联系人数据被拒绝',
          details: null);
    } else if (permissionStatus == PermissionStatus.restricted) {
      throw PlatformException(
          code: 'PERMISSION_DISABLED',
          message: '设备上未提供联系人数据',
          details: null);
    }
  }
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('联系人插件示例')),
      body: _hasPermission == null
          ? Center(child: PlatformCircularProgressIndicator())
          : SafeArea(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  ElevatedButton(
                    child: const Text('联系人列表'),
                    onPressed: () =>
                        Navigator.pushNamed(context, '/contactsList'),
                  ),
                  ElevatedButton(
                    child: const Text('原生联系人选择器'),
                    onPressed: () =>
                        Navigator.pushNamed(context, '/nativeContactPicker'),
                  ),
                ],
              ),
            ),
    );
  }
}
更多关于Flutter联系人管理插件flutter_contact的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter联系人管理插件flutter_contact的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
Flutter 提供了许多插件来简化开发过程,其中一个有用的插件是 flutter_contacts,它允许你在 Flutter 应用中访问和管理设备的联系人。以下是使用 flutter_contacts 插件的详细步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml 文件中添加 flutter_contacts 插件的依赖。
dependencies:
  flutter:
    sdk: flutter
  flutter_contacts: ^1.0.0  # 使用最新版本
然后运行 flutter pub get 来获取依赖。
2. 请求权限
访问联系人需要用户权限,因此在访问联系人之前,你需要请求相应的权限。在 Android 上,你需要 READ_CONTACTS 和 WRITE_CONTACTS 权限。在 iOS 上,你需要 Contacts 权限。
你可以使用 permission_handler 插件来请求权限。
首先,添加 permission_handler 插件的依赖:
dependencies:
  permission_handler: ^10.0.0  # 使用最新版本
然后请求权限:
import 'package:permission_handler/permission_handler.dart';
Future<void> requestContactsPermission() async {
  if (await Permission.contacts.request().isGranted) {
    // 权限已授予
  } else {
    // 权限被拒绝
  }
}
3. 使用 flutter_contacts 插件
初始化
在请求权限后,你可以使用 flutter_contacts 插件来访问联系人。
import 'package:flutter_contacts/flutter_contacts.dart';
Future<void> getContacts() async {
  if (await Permission.contacts.request().isGranted) {
    List<Contact> contacts = await FlutterContacts.getContacts();
    for (var contact in contacts) {
      print(contact.displayName);
    }
  } else {
    print('Permission denied');
  }
}
添加联系人
你可以使用 flutter_contacts 插件来添加新的联系人。
Contact newContact = Contact()
  ..name.firstName = 'John'
  ..name.lastName = 'Doe'
  ..phones = [Phone('1234567890')];
await FlutterContacts.insertContact(newContact);
更新联系人
你可以更新现有的联系人。
Contact contactToUpdate = await FlutterContacts.getContact(contactId);
contactToUpdate.phones[0].number = '0987654321';
await FlutterContacts.updateContact(contactToUpdate);
删除联系人
你可以删除联系人。
await FlutterContacts.deleteContact(contactId);
4. 完整示例
import 'package:flutter/material.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ContactsScreen(),
    );
  }
}
class ContactsScreen extends StatefulWidget {
  [@override](/user/override)
  _ContactsScreenState createState() => _ContactsScreenState();
}
class _ContactsScreenState extends State<ContactsScreen> {
  List<Contact> contacts = [];
  Future<void> getContacts() async {
    if (await Permission.contacts.request().isGranted) {
      List<Contact> fetchedContacts = await FlutterContacts.getContacts();
      setState(() {
        contacts = fetchedContacts;
      });
    } else {
      print('Permission denied');
    }
  }
  [@override](/user/override)
  void initState() {
    super.initState();
    getContacts();
  }
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Contacts'),
      ),
      body: ListView.builder(
        itemCount: contacts.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(contacts[index].displayName),
            subtitle: contacts[index].phones.isNotEmpty
                ? Text(contacts[index].phones.first.number)
                : null,
          );
        },
      ),
    );
  }
}
        
      
            
            
            
