easy_contact_picker
Flutter 通讯录联系人选择器,同时支持Android和iOS,可以打开Native通讯录选择联系人,也可以返回通讯录列表,自己构建UI。
用法
添加这一行到pubspec.yaml
easy_contact_picker: ^0.0.2
引用
import 'package:easy_contact_picker/easy_contact_picker.dart';
权限添加
Android
<!-- 读取联系人 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
iOS
info.plist中添加读取通讯录权限
Privacy - Contacts Usage Description
Background Modes中 Background fetch 和 Remote notification打对勾
示例
调Native通讯录方法
Future<List<Contact>> selectContacts() async {
final List result =
await _channel.invokeMethod('selectContactList');
if (result == null) {
return null;
}
List<Contact> contacts = new List();
result.forEach((f){
contacts.add(new Contact.fromMap(f));
});
return contacts;
}
返回通讯录联系人List
Future<Contact> selectContactWithNative() async {
final Map<dynamic, dynamic> result =
await _channel.invokeMethod('selectContactNative');
if (result == null) {
return null;
}
return new Contact.fromMap(result);
}
需要获取权限,本示例使用的申请权限参考
# 权限申请
permission_handler: '^3.2.0'
权限使用方法
_openAddressBook() async{
// 申请权限
Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.contacts]);
// 申请结果
PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
//granted表示申请成功
if (permission == PermissionStatus.granted){
}
}
访问Native通讯录示例
class HostPage extends StatefulWidget {
@override
_HostPageState createState() => _HostPageState();
}
class _HostPageState extends State<HostPage> with AutomaticKeepAliveClientMixin{
Contact _contact = new Contact(fullName: "", phoneNumber: "");
final EasyContactPicker _contactPicker = new EasyContactPicker();
_openAddressBook() async{
// 申请权限
Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.contacts]);
// 申请结果
PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
if (permission == PermissionStatus.granted){
_getContactData();
}
}
_getContactData() async{
Contact contact = await _contactPicker.selectContactWithNative();
setState(() {
_contact = contact;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("首页"),
),
body: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(13, 20, 13, 10),
child: Row(
children: <Widget>[
Text("姓名:"),
Text(_contact.fullName)
],
),
),
Padding(
padding: EdgeInsets.fromLTRB(13, 0, 13, 20),
child: Row(
children: <Widget>[
Text("手机号:"),
Text(_contact.phoneNumber)
],
),
),
FlatButton(
child: Text("打开通讯录"),
onPressed: _openAddressBook,
)
],
),
);
}
@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
}
获取通讯录联系人List示例
class AddressBookPage extends StatefulWidget {
@override
_AddressBookPageState createState() => _AddressBookPageState();
}
class _AddressBookPageState extends State<AddressBookPage> with AutomaticKeepAliveClientMixin{
List<Contact> _list = new List();
final EasyContactPicker _contactPicker = new EasyContactPicker();
@override
void initState() {
// TODO: implement initState
super.initState();
_openAddressBook();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("通讯录"),
),
body: ListView.builder(
itemBuilder: (context, index){
return _getItemWithIndex(_list[index]);
},
itemCount: _list.length,
)
);
}
Widget _getItemWithIndex(Contact contact){
return Container(
height: 45,
padding: EdgeInsets.only(left: 13),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(contact.fullName),
Text(contact.phoneNumber,
style: TextStyle(
color: Colors.grey,
),
),
],
),
);
}
_openAddressBook() async{
// 申请权限
Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.contacts]);
// 申请结果
PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
if (permission == PermissionStatus.granted){
_getContactData();
}
}
_getContactData() async{
List<Contact> list = await _contactPicker.selectContacts();
setState(() {
_list = list;
});
}
@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
}
完整例子请访问:
git:https://github.com/liuweilyy/easy_contact_picker
网友评论