Flutter原生联系人选择插件flutter_native_contact_picker的使用
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
更多关于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
插件来选择联系人了。