我想将我的联系人列表获取到我的 flutter 应用程序,我想要姓名和号码,我尝试过,但在屏幕中它不可见,但后端终端我正在获取所有联系人列表,并且我的联系人在终端中显示两次,请检查代码和指南并帮助我如何在 flutter 应用程序中显示我的所有联系人列表。
class ContactsPage extends StatefulWidget {
@override
_ContactsPageState createState() => _ContactsPageState();
}
class _ContactsPageState extends State<ContactsPage> {
var _contacts = [];
@override
void initState() {
super.initState();
_contacts = getContacts();
}
getContacts() async {
Iterable<Contact> contacts = await ContactsService.getContacts();
for (var contact in contacts) {
print('Name: ${contact.displayName }');
print('Phone number: ${contact.phones!.isNotEmpty }');
// Add more fields as needed
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Contacts List'),
),
body:
ListView.builder(
itemCount: _contacts.length,
itemBuilder: (context, index) {
Contact contact = _contacts[index];
List<Item> phoneNumbers = contact.phones!.toList();
return Column(
children: [
ListTile(
title: Text(' ${contact.displayName }'),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: phoneNumbers.map((Item phoneNumber) {
return Text('${contact.phones!.isNotEmpty ? contact.phones!.first.value : ' '}');
}).toList(),
),
),
],
);
},
),
);
}
}
很多细节你必须检查。
1。您必须先检查权限。
我正在使用Permission Handler来检查权限,是否已授予。
2。你必须使用其他状态管理的FutureBuilder。
这里我使用 FutureBuilder,因为 ContactService 包需要一些时间来从本机获取所有联系人。响应可能为空或其他错误。你需要先检查一下情况。
import 'package:contacts_service/contacts_service.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
class ContactsPage extends StatefulWidget {
const ContactsPage({super.key});
@override
_ContactsPageState createState() => _ContactsPageState();
}
class _ContactsPageState extends State<ContactsPage> {
@override
void initState() {
super.initState();
_askPermissions();
}
Future<void> _askPermissions() async {
PermissionStatus permissionStatus = await _getContactPermission();
if (permissionStatus != PermissionStatus.granted) {
_handleInvalidPermissions(permissionStatus);
}
}
Future<PermissionStatus> _getContactPermission() async {
PermissionStatus permission = await Permission.contacts.status;
if (permission != PermissionStatus.granted &&
permission != PermissionStatus.permanentlyDenied) {
PermissionStatus permissionStatus = await Permission.contacts.request();
return permissionStatus;
} else {
return permission;
}
}
void _handleInvalidPermissions(PermissionStatus permissionStatus) {
if (permissionStatus == PermissionStatus.denied) {
const snackBar = SnackBar(content: Text('Access to contact data denied'));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
} else if (permissionStatus == PermissionStatus.permanentlyDenied) {
const snackBar =
SnackBar(content: Text('Contact data not available on device'));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
}
Future<List<Contact>>? reqContact;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Contacts List'),
),
body: Column(
children: [
ElevatedButton(
onPressed: () {
setState(() {
reqContact = ContactsService.getContacts();
});
},
child: const Text("Load Contact")),
Expanded(
child: FutureBuilder(
future: reqContact,
builder: (context, snp) {
if (snp.connectionState == ConnectionState.done) {
var contacts = snp.data;
if (contacts != null) {
return ListView.builder(
shrinkWrap: true,
itemCount: contacts.length,
itemBuilder: (context, index) {
Contact contact = contacts[index];
return ListTile(
title: Text(' ${contact.displayName}'),
subtitle: Text(contact.phones?.single.value ??
"not found"));
});
}
return Container();
}
return Container();
})),
],
),
);
}
}