Flutter联系人获取插件contact_fetcher的使用

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

Flutter联系人获取插件contact_fetcher的使用

contact_fetcher 是一个用于从移动设备获取联系人的 Flutter 插件。

开始使用

这个项目是一个 Flutter 的插件包起点,它包含适用于 Android 和/或 iOS 的平台特定实现代码。

对于如何开始 Flutter 开发的帮助,可以查看 在线文档,其中提供了教程、示例、移动开发指南以及完整的 API 参考。

完整示例代码

以下是一个完整的示例代码,展示了如何使用 contact_fetcher 插件来获取并展示联系人信息:

import 'package:contact_fetcher/contact.dart';
import 'package:contact_fetcher/contact_fetcher.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Contact> _contacts = [];
  final _contactFetcherPlugin = ContactFetcher();
  final ScrollController _controller = ScrollController();
  int _pageNumber = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _controller.addListener(() async {
      // 滚动到底部时加载更多联系人
      if (_controller.position.pixels == _controller.position.maxScrollExtent) {
        updated();
      }
    });
    updated();
  }

  // 更新联系人列表
  updated() async {
    try {
      // 获取指定页数的联系人
      List<Contact> contacts = await _contactFetcherPlugin.getAllContact(
          limit: 10, pageNumber: _pageNumber);
      // 将新获取的联系人添加到现有列表中
      _contacts.addAll(contacts);
      _pageNumber++;
    } on PlatformException {
      // 处理异常情况
      _contacts = [];
    }
    // 更新UI
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('联系人获取器 (${_contacts.length})')),
        body: ListView.builder(
            key: Key("keyyyy"),
            controller: _controller,
            itemCount: _contacts.length,
            itemBuilder: (BuildContext context, int index) {
              return Padding(
                padding: const EdgeInsets.all(8.0),
                child: Card(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Center(
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          // 显示联系人头像
                          if (_contacts[index].photo != null)
                            Image.memory(_contacts[index].photo!,
                                width: 40, height: 40),
                          // 显示联系人姓名
                          Text("姓名: ${_contacts[index].name}"),
                          // 显示联系人电话号码
                          ListView.builder(
                              physics: const NeverScrollableScrollPhysics(),
                              shrinkWrap: true,
                              itemCount: _contacts[index].phoneNumbers.length,
                              itemBuilder: (context, phoneIndex) {
                                return Padding(
                                  padding: const EdgeInsets.only(top: 8),
                                  child: Text(
                                      "电话 ${phoneIndex + 1} : ${_contacts[index].phoneNumbers[phoneIndex]}"),
                                );
                              })
                        ],
                      ),
                    ),
                  ),
                ),
              );
            }),
      ),
    );
  }
}

代码解释

  1. 导入必要的库

    import 'package:contact_fetcher/contact.dart';
    import 'package:contact_fetcher/contact_fetcher.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
  2. 主应用类

    void main() {
      runApp(const MyApp());
    }
    
  3. 状态管理类

    class _MyAppState extends State<MyApp> {
      List<Contact> _contacts = [];
      final _contactFetcherPlugin = ContactFetcher();
      final ScrollController _controller = ScrollController();
      int _pageNumber = 0;
    
  4. 初始化方法

    [@override](/user/override)
    void initState() {
      super.initState();
      _controller.addListener(() async {
        if (_controller.position.pixels == _controller.position.maxScrollExtent) {
          updated();
        }
      });
      updated();
    }
    
  5. 更新联系人列表的方法

    updated() async {
      try {
        List<Contact> contacts = await _contactFetcherPlugin.getAllContact(
            limit: 10, pageNumber: _pageNumber);
        _contacts.addAll(contacts);
        _pageNumber++;
      } on PlatformException {
        _contacts = [];
      }
      setState(() {});
    }
    
  6. 构建UI

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('联系人获取器 (${_contacts.length})')),
          body: ListView.builder(
              key: Key("keyyyy"),
              controller: _controller,
              itemCount: _contacts.length,
              itemBuilder: (BuildContext context, int index) {
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Card(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Center(
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            if (_contacts[index].photo != null)
                              Image.memory(_contacts[index].photo!,
                                  width: 40, height: 40),
                            Text("姓名: ${_contacts[index].name}"),
                            ListView.builder(
                                physics: const NeverScrollableScrollPhysics(),
                                shrinkWrap: true,
                                itemCount: _contacts[index].phoneNumbers.length,
                                itemBuilder: (context, phoneIndex) {
                                  return Padding(
                                    padding: const EdgeInsets.only(top: 8),
                                    child: Text(
                                        "电话 ${phoneIndex + 1} : ${_contacts[index].phoneNumbers[phoneIndex]}"),
                                  );
                                })
                          ],
                        ),
                      ),
                    ),
                  ),
                );
              }),
        ),
      );
    }
    

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

1 回复

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


当然,以下是如何在Flutter项目中使用contact_fetcher插件来获取联系人信息的代码示例。contact_fetcher插件允许你访问设备上的联系人数据,但请注意,在实际应用中,你需要在Android和iOS平台上分别配置相应的权限。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  contact_fetcher: ^latest_version  # 请替换为最新版本号

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

2. 配置权限

Android

android/app/src/main/AndroidManifest.xml中添加以下权限:

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

iOS

ios/Runner/Info.plist中添加以下权限:

<key>NSContactsUsageDescription</key>
<string>We need access to your contacts to display them in the app.</string>

3. 请求权限并获取联系人

接下来,在你的Flutter代码中请求权限并获取联系人信息。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:contact_fetcher/contact_fetcher.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ContactScreen(),
    );
  }
}

class ContactScreen extends StatefulWidget {
  @override
  _ContactScreenState createState() => _ContactScreenState();
}

class _ContactScreenState extends State<ContactScreen> {
  List<Contact> contacts = [];

  @override
  void initState() {
    super.initState();
    _requestPermissionsAndFetchContacts();
  }

  Future<void> _requestPermissionsAndFetchContacts() async {
    // 请求联系人权限
    var status = await Permission.contacts.status;
    if (!status.isGranted) {
      var result = await Permission.contacts.request();
      if (result.isGranted) {
        _fetchContacts();
      } else if (result.isDenied || result.isPermanentlyDenied) {
        // 处理权限被拒绝的情况
        print("Contacts permission denied");
      }
    } else {
      _fetchContacts();
    }
  }

  Future<void> _fetchContacts() async {
    try {
      var fetchedContacts = await ContactFetcher.getContacts();
      setState(() {
        contacts = fetchedContacts;
      });
    } catch (e) {
      print("Error fetching contacts: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Contacts'),
      ),
      body: contacts.isEmpty
          ? Center(child: Text('Loading contacts...'))
          : ListView.builder(
              itemCount: contacts.length,
              itemBuilder: (context, index) {
                var contact = contacts[index];
                return ListTile(
                  title: Text('${contact.displayName}'),
                  subtitle: Text('${contact.phones.firstOrNull?.value}'),
                );
              }),
    );
  }
}

注意事项

  1. 权限处理:在实际应用中,处理权限请求的结果非常重要,特别是当用户拒绝权限时,应该给用户一个清晰的提示,并告知他们权限的必要性。
  2. 错误处理:在获取联系人信息时,应该添加更多的错误处理逻辑,以确保应用的健壮性。
  3. UI设计:上述示例的UI设计非常简单,你可能需要根据自己的需求进行定制。

以上代码示例展示了如何在Flutter中使用contact_fetcher插件来获取联系人信息,并处理相关的权限请求。希望这对你有所帮助!

回到顶部