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

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

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

contacts_service 是一个Flutter插件,允许访问和管理设备上的联系人信息。以下是如何使用这个插件的详细说明。

安装

要在项目中使用此插件,请在 pubspec.yaml 文件中添加依赖项:

dependencies:  
    contacts_service: ^0.6.3

然后运行 flutter pub get 来安装该包。

权限配置

Android

对于Android应用,在 AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

iOS

对于iOS应用,在 Info.plist 文件中设置 NSContactsUsageDescription 键:

<key>NSContactsUsageDescription</key>
<string>本应用需要访问您的联系人以正常工作。</string>

注意:contacts_service 不会处理请求或检查权限的过程。建议结合使用 permission_handler 插件来实现权限管理功能。

示例代码

下面是一个完整的示例应用程序,演示如何使用 contacts_service 插件读取、添加和删除联系人。

import 'package:flutter/material.dart';
import 'package:contacts_service/contacts_service.dart';
import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Contacts Service Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ContactPage(),
    );
  }
}

class ContactPage extends StatefulWidget {
  @override
  _ContactPageState createState() => _ContactPageState();
}

class _ContactPageState extends State<ContactPage> {
  List<Contact> _contacts = [];
  bool _hasPermission = false;

  @override
  void initState() {
    super.initState();
    _checkPermissions();
  }

  Future<void> _checkPermissions() async {
    final status = await Permission.contacts.status;
    if (status.isGranted) {
      setState(() {
        _hasPermission = true;
      });
      _loadContacts();
    } else {
      final result = await Permission.contacts.request();
      if (result.isGranted) {
        setState(() {
          _hasPermission = true;
        });
        _loadContacts();
      }
    }
  }

  Future<void> _loadContacts() async {
    try {
      final Iterable<Contact> contacts = await ContactsService.getContacts(
        withThumbnails: false,
      );
      setState(() {
        _contacts = contacts.toList();
      });
    } catch (e) {
      print('Failed to load contacts: $e');
    }
  }

  Future<void> _addContact() async {
    final newContact = Contact(
      givenName: 'John',
      familyName: 'Doe',
      phones: [Item(label: 'mobile', value: '123456789')],
    );
    try {
      await ContactsService.addContact(newContact);
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Contact added successfully')),
      );
      _loadContacts(); // Refresh the list after adding a contact
    } catch (e) {
      print('Failed to add contact: $e');
    }
  }

  Future<void> _deleteContact(Contact contact) async {
    try {
      await ContactsService.deleteContact(contact);
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Contact deleted successfully')),
      );
      _loadContacts(); // Refresh the list after deleting a contact
    } catch (e) {
      print('Failed to delete contact: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Contacts'),
      ),
      body: _hasPermission
          ? ListView.builder(
              itemCount: _contacts.length,
              itemBuilder: (context, index) {
                final contact = _contacts[index];
                return ListTile(
                  title: Text('${contact.displayName}'),
                  subtitle: Text(contact.phones.isNotEmpty
                      ? contact.phones.first.value ?? ''
                      : ''),
                  trailing: IconButton(
                    icon: Icon(Icons.delete),
                    onPressed: () => _deleteContact(contact),
                  ),
                );
              },
            )
          : Center(child: Text('Please grant permission to access contacts.')),
      floatingActionButton: FloatingActionButton(
        onPressed: _addContact,
        tooltip: 'Add Contact',
        child: Icon(Icons.person_add),
      ),
    );
  }
}

此示例展示了如何:

  • 检查并请求联系人访问权限。
  • 加载设备上的所有联系人。
  • 添加新联系人。
  • 删除现有联系人。

请注意,实际应用中还需要考虑更多边界情况(如用户拒绝权限时的操作),并且可能需要根据具体需求调整UI设计。


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

1 回复

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


当然,下面是一个关于如何使用 contacts_service 插件在 Flutter 中管理联系人的示例代码。这个示例将展示如何获取联系人列表、读取单个联系人信息以及添加新联系人。

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

dependencies:
  flutter:
    sdk: flutter
  contacts_service: ^0.6.3  # 请检查最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,你需要配置 Android 和 iOS 的权限。

Android 配置

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

iOS 配置

ios/Runner/Info.plist 文件中添加以下权限描述:

<key>NSContactsUsageDescription</key>
<string>This app needs access to your contacts</string>
<key>NSContactsUsageDescriptionWhenInUse</key>
<string>This app needs access to your contacts when in use</string>

Flutter 代码示例

在你的 Flutter 项目中,创建一个 Dart 文件(例如 contacts_manager.dart)并添加以下代码:

import 'package:flutter/material.dart';
import 'package:contacts_service/contacts_service.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Contacts Manager',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ContactsPage(),
    );
  }
}

class ContactsPage extends StatefulWidget {
  @override
  _ContactsPageState createState() => _ContactsPageState();
}

class _ContactsPageState extends State<ContactsPage> {
  List<Contact> contacts = [];

  @override
  void initState() {
    super.initState();
    _requestPermissions();
  }

  Future<void> _requestPermissions() async {
    bool hasPermission = await Permission.contacts.status.isGranted;
    if (!hasPermission) {
      bool requestPermission = await Permission.contacts.request();
      if (requestPermission) {
        _getContacts();
      } else {
        // 权限被拒绝
      }
    } else {
      _getContacts();
    }
  }

  Future<void> _getContacts() async {
    List<Contact> result = await ContactsService.getContacts(
      withThumbnails: false,
    );
    setState(() {
      contacts = result;
    });
  }

  Future<void> _addContact() async {
    Contact newContact = Contact()
      ..givenName = "John"
      ..familyName = "Doe"
      ..phones = [Item(label: "mobile", value: "1234567890")];

    bool success = await ContactsService.addContact(newContact);
    if (success) {
      _getContacts();
    } else {
      // 添加失败
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Contacts Manager'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            Expanded(
              child: ListView.builder(
                itemCount: contacts.length,
                itemBuilder: (context, index) {
                  Contact contact = contacts[index];
                  return ListTile(
                    title: Text('${contact.givenName} ${contact.familyName}'),
                    subtitle: Text(contact.phones.first.value),
                  );
                },
              ),
            ),
            ElevatedButton(
              onPressed: _addContact,
              child: Text('Add Contact'),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 权限请求:在 _requestPermissions 方法中,我们请求联系人权限。如果用户未授予权限,我们将请求权限。

  2. 获取联系人:在 _getContacts 方法中,我们调用 ContactsService.getContacts 来获取联系人列表。

  3. 添加联系人:在 _addContact 方法中,我们创建一个新的 Contact 对象,并使用 ContactsService.addContact 方法将其添加到联系人中。

  4. UI:在 ContactsPage 中,我们使用 ListView.builder 来显示联系人列表,并提供一个按钮来添加新联系人。

确保你已经添加了 permission_handler 依赖来请求权限:

dependencies:
  permission_handler: ^9.2.0  # 请检查最新版本号

运行应用时,它将请求联系人权限,并显示联系人列表,同时提供一个按钮来添加新联系人。

回到顶部