You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:03:24