Flutter原生联系人选择插件flutter_native_contact_picker的使用

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

Flutter原生联系人选择插件flutter_native_contact_picker的使用

flutter_native_contact_picker简介

flutter_native_contact_picker 是一个Flutter插件,允许应用请求用户从其通讯录中选择联系人或多个联系人,并可以选择特定的电话号码。所选联系人的信息将返回给应用程序。

该插件使用操作系统原生的UI来选择联系人,不需要用户授予特殊的权限,即使是在Android上也无需READ_CONTACTS权限。

功能特性

iOS支持

  • 选择单个联系人
  • 选择多个联系人
  • 从联系人中选择特定电话号码
  • 返回所有选定联系人的电话号码

Android支持

  • 选择单个联系人
  • 从联系人中选择特定电话号码(仅返回选定号码)
  • 不需要READ_CONTACTS权限

使用方法

基本联系人选

// 创建选择器实例
final FlutterNativeContactPicker _contactPicker = FlutterNativeContactPicker();

// 选择单个联系人
Contact? contact = await _contactPicker.selectContact();
print(contact?.fullName);
print(contact?.phoneNumbers);

// 选择多个联系人 (仅iOS支持)
List<Contact>? contacts = await _contactPicker.selectContacts();
for (var contact in contacts ?? []) {
  print(contact.fullName);
  print(contact.phoneNumbers);
}

电话号码选择

// 选择特定电话号码
Contact? contact = await _contactPicker.selectPhoneNumber();
print(contact?.fullName);
print(contact?.selectedPhoneNumber); // 特定选择的号码
print(contact?.phoneNumbers); // 所有可用号码 (仅iOS)

Contact模型

Contact类提供了以下属性:

class Contact {
  final String? fullName;           // 联系人的全名
  final List<String>? phoneNumbers; // 所有电话号码 (iOS: 所有号码, Android: 仅选定号码)
  final String? selectedPhoneNumber; // 使用selectPhoneNumber()时特别选定的电话号码
}

平台差异

iOS

  • 支持选择多个联系人
  • 返回与联系人关联的所有电话号码
  • 使用selectPhoneNumber()时,返回选定号码和所有可用号码
  • 使用原生CNContactPickerViewController

Android

  • 仅支持单个联系人选择
  • 使用selectPhoneNumber()时,仅返回选定的电话号码
  • 不需要READ_CONTACTS权限
  • 使用原生联系人选择Intent

示例代码

以下是完整的示例demo,演示了如何在Flutter应用中使用flutter_native_contact_picker插件:

import 'package:flutter/material.dart';
import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';
import 'package:flutter_native_contact_picker/model/contact.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final FlutterNativeContactPicker _contactPicker =
      FlutterNativeContactPicker();
  List<Contact>? _contacts;
  String? _selectedPhoneNumber;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Contact Picker Example App'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              const Text(
                'Contact Selection',
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 8),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  MaterialButton(
                    color: Colors.blue,
                    textColor: Colors.white,
                    child: const Text("Single Contact"),
                    onPressed: () async {
                      Contact? contact = await _contactPicker.selectContact();
                      setState(() {
                        _contacts = contact == null ? null : [contact];
                        _selectedPhoneNumber = null;
                      });
                    },
                  ),
                  const SizedBox(width: 8),
                  MaterialButton(
                    color: Colors.blue,
                    textColor: Colors.white,
                    child: const Text("Multiple Contacts"),
                    onPressed: () async {
                      final contacts = await _contactPicker.selectContacts();
                      setState(() {
                        _contacts = contacts;
                        _selectedPhoneNumber = null;
                      });
                    },
                  ),
                ],
              ),
              const SizedBox(height: 16),
              const Text(
                'Phone Number Selection',
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 8),
              MaterialButton(
                color: Colors.green,
                textColor: Colors.white,
                child: const Text("Select Phone Number"),
                onPressed: () async {
                  Contact? contact = await _contactPicker.selectPhoneNumber();
                  setState(() {
                    _contacts = contact == null ? null : [contact];
                    _selectedPhoneNumber = contact?.selectedPhoneNumber;
                  });
                },
              ),
              const SizedBox(height: 24),
              if (_contacts != null) ...[
                const Text(
                  'Selected Contact(s):',
                  style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
                ),
                const SizedBox(height: 8),
                ..._contacts!.map(
                  (contact) => Padding(
                    padding: const EdgeInsets.symmetric(vertical: 4),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      children: [
                        Text(
                          contact.fullName ?? 'No name',
                          style: const TextStyle(fontWeight: FontWeight.w500),
                        ),
                        if (_selectedPhoneNumber != null)
                          Text(
                            'Selected number: $_selectedPhoneNumber',
                            style: const TextStyle(color: Colors.green),
                          ),
                        ...?contact.phoneNumbers?.map(
                          (number) => Text(
                            number,
                            style: TextStyle(
                              color: number == _selectedPhoneNumber
                                  ? Colors.green
                                  : Colors.black54,
                            ),
                          ),
                        ),
                        const SizedBox(height: 8),
                      ],
                    ),
                  ),
                ),
              ],
            ],
          ),
        ),
      ),
    );
  }
}

此示例展示了如何创建一个简单的Flutter应用,其中包含选择单个联系人、多个联系人以及选择特定电话号码的功能。希望这个例子能帮助您更好地理解和使用flutter_native_contact_picker插件。


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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用flutter_native_contact_picker插件的详细步骤,包括代码示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_native_contact_picker: ^x.y.z  # 请替换为最新版本号

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

2. 导入插件

在你需要使用联系人选择功能的Dart文件中,导入插件:

import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';

3. 请求权限

在Android和iOS上,你需要在运行时请求联系人权限。这里以Android为例,你需要在AndroidManifest.xml中添加权限:

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

对于iOS,你需要在Info.plist中添加相应的权限说明。

4. 使用插件

下面是一个完整的示例,展示如何使用flutter_native_contact_picker来选择联系人:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Contact Picker Example'),
        ),
        body: Center(
          child: ContactPickerButton(),
        ),
      ),
    );
  }
}

class ContactPickerButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        try {
          List<Contact> contacts = await ContactPicker.pickContacts(withThumbnail: true);
          
          if (contacts.isNotEmpty) {
            showDialog(
              context: context,
              builder: (context) {
                return AlertDialog(
                  title: Text('Selected Contacts'),
                  content: ListView.builder(
                    shrinkWrap: true,
                    itemCount: contacts.length,
                    itemBuilder: (context, index) {
                      Contact contact = contacts[index];
                      return ListTile(
                        leading: contact.thumbnailPath != null
                            ? Image.file(File(contact.thumbnailPath!))
                            : Icon(Icons.contact_mail_outlined),
                        title: Text(contact.displayName ?? 'Unknown'),
                        subtitle: Text('Phone: ${contact.phoneNumbers.join(", ")}'),
                      );
                    },
                  ),
                );
              },
            );
          }
        } catch (e) {
          print("Error: $e");
        }
      },
      child: Text('Pick Contacts'),
    );
  }
}

5. 处理联系人数据

上面的代码示例中,ContactPicker.pickContacts(withThumbnail: true)方法用于选择联系人,并请求包含缩略图的联系人数据。选择完成后,会在对话框中显示所选联系人的姓名和电话号码。

6. 运行应用

确保你已经连接了一个Android或iOS设备,或者正在使用模拟器,然后运行flutter run来启动应用。

注意事项

  • 确保你的设备或模拟器已经授予了应用读取联系人权限。
  • 根据你的具体需求,可能需要调整联系人数据的处理方式。

这样,你就可以在你的Flutter应用中集成和使用flutter_native_contact_picker插件来选择联系人了。

回到顶部