如何将我的设备所有联系人列表获取到我的 flutter 应用程序

问题描述 投票:0回答:1

我想将我的联系人列表获取到我的 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(),
         ),
         ),
        ],
      );
    },
   ),
  );
 }
}
contacts android-contacts
1个回答
0
投票

很多细节你必须检查。

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();
                  })),
        ],
      ),
    );
  }
}

这是我的 pubspec.yaml

© www.soinside.com 2019 - 2024. All rights reserved.