在Flutter中实现联系人功能,可以通过以下步骤实现:
1. 添加权限
在 android/app/src/main/AndroidManifest.xml 中添加读取联系人权限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
在 ios/Runner/Info.plist 中添加:
<key>NSContactsUsageDescription</key>
<string>需要访问联系人以显示列表</string>
2. 使用联系人插件
推荐使用 contacts_service 插件:
dependencies:
contacts_service: ^0.6.1
3. 请求权限
使用 permission_handler 请求权限:
import 'package:permission_handler/permission_handler.dart';
Future<void> requestContactPermission() async {
final status = await Permission.contacts.request();
if (status.isDenied) {
// 处理权限被拒绝
}
}
4. 获取联系人列表
import 'package:contacts_service/contacts_service.dart';
Future<List<Contact>> getContacts() async {
return await ContactsService.getContacts();
}
5. 显示联系人
ListView.builder(
itemCount: contacts.length,
itemBuilder: (context, index) {
final contact = contacts[index];
return ListTile(
title: Text(contact.displayName ?? ''),
subtitle: Text(contact.phones?.first?.value ?? ''),
);
},
)
6. 完整示例
import 'package:flutter/material.dart';
import 'package:contacts_service/contacts_service.dart';
import 'package:permission_handler/permission_handler.dart';
class ContactPage extends StatefulWidget {
@override
_ContactPageState createState() => _ContactPageState();
}
class _ContactPageState extends State<ContactPage> {
List<Contact> contacts = [];
@override
void initState() {
super.initState();
_fetchContacts();
}
Future<void> _fetchContacts() async {
if (await Permission.contacts.request().isGranted) {
final contacts = await ContactsService.getContacts();
setState(() => this.contacts = contacts);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('联系人')),
body: ListView.builder(
itemCount: contacts.length,
itemBuilder: (context, index) {
final contact = contacts[index];
return ListTile(
title: Text(contact.displayName ?? ''),
subtitle: Text(contact.phones?.first?.value ?? ''),
);
},
),
);
}
}
注意事项:
- 需要处理权限被拒绝的情况
- 联系人信息可能为空,需要空值检查
- iOS需要真实设备测试权限
这样就实现了基本的联系人读取和显示功能。