Flutter联系人获取插件contact_fetcher的使用
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]}"),
);
})
],
),
),
),
),
);
}),
),
);
}
}
代码解释
-
导入必要的库
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 _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 = []; } setState(() {}); }
-
构建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
更多关于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}'),
);
}),
);
}
}
注意事项
- 权限处理:在实际应用中,处理权限请求的结果非常重要,特别是当用户拒绝权限时,应该给用户一个清晰的提示,并告知他们权限的必要性。
- 错误处理:在获取联系人信息时,应该添加更多的错误处理逻辑,以确保应用的健壮性。
- UI设计:上述示例的UI设计非常简单,你可能需要根据自己的需求进行定制。
以上代码示例展示了如何在Flutter中使用contact_fetcher
插件来获取联系人信息,并处理相关的权限请求。希望这对你有所帮助!