使用flutter_contacts获取联系人时groups列表为空的问题排查
联系人分组列表为空的问题排查与解决
我已经给联系人分好组了,但调用print()输出联系人时,groups列表是空的,明明该联系人属于某个分组,这是怎么回事?
相关代码:
import 'package:flutter/material.dart'; import 'package:flutter_contacts/contact.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; class ContactsPage extends StatefulWidget { const ContactsPage({super.key}); @override State<ContactsPage> createState() => _ContactsPageState(); } class _ContactsPageState extends State<ContactsPage> { List<Contact> _contacts =[]; @override void initState() { super.initState(); _fetchContacts(); } Future _fetchContacts() async { if (!await FlutterContacts.requestPermission()) { } else { List<Contact> contacts = await FlutterContacts.getContacts(withProperties: true); setState(() => _contacts = contacts); print(_contacts); } return _contacts; } @override Widget build(BuildContext context) { return Scaffold( body: FutureBuilder( future: _fetchContacts(), builder: (BuildContext context, index) { return ListView.builder( itemCount: _contacts.length, itemBuilder: (BuildContext context, int index) { return ListTile( title: Text(_contacts[index].groups[0].name), ); }, ); },), ); } }
控制台输出:
I/flutter ( 9205): [Contact(id=253, displayName=A. H pahlozadeh, thumbnail=null, photo=null, isStarred=false, name=Name(first=A., last=pahlozadeh, middle=H, prefix=, suffix=, nickname=, firstPhonetic=, lastPhonetic=, middlePhonetic=), phones=[], emails=[Email(address=ahamidp@gmail.com, label=EmailLabel.other, customLabel=, isPrimary=true)], addresses=[], organizations=[], websites=[Website(url=http://www.google.com/profiles/114734360510822226117, label=WebsiteLabel.profile, customLabel=)], socialMedias=[], events=[], notes=[], accounts=[], groups=[]
问题原因
flutter_contacts库的getContacts方法默认不会加载联系人的分组关联数据,仅设置withProperties: true只能获取联系人的基础属性(如姓名、邮箱等),不会包含分组信息。
解决方法
在调用getContacts时,额外添加withGroups: true参数,明确告知库需要获取联系人所属的分组数据:
修改后的_fetchContacts方法:
Future _fetchContacts() async { if (!await FlutterContacts.requestPermission()) { } else { List<Contact> contacts = await FlutterContacts.getContacts( withProperties: true, withGroups: true, // 新增此参数 ); setState(() => _contacts = contacts); print(_contacts); } return _contacts; }
额外提示
你当前的ListView代码直接访问_contacts[index].groups[0].name存在索引越界风险(如果某个联系人确实没有分组),建议增加空判断:
itemBuilder: (BuildContext context, int index) { final contact = _contacts[index]; return ListTile( title: Text(contact.groups.isNotEmpty ? contact.groups[0].name : '无分组'), ); },
内容的提问来源于stack exchange,提问作者Ehsan zarei
相关产品推荐
相关产品推荐

