使用flutter_contacts插入联系人时group(label)字段为空问题
问题:使用flutter_contacts添加联系人时,群组(Group)未在系统通讯录中显示
我通过flutter_contacts库创建新联系人并指定了群组,控制台打印的联系人对象显示群组信息正确,但打开模拟器系统通讯录后,联系人的群组字段为空,其他信息均正常保存。
项目结构:lib文件夹包含main.dart和insert_contact.dart,预期新联系人会被添加到模拟器通讯录,且显示指定的群组名称。
代码文件
main.dart
import 'package:myapp/insert_contact.dart'; import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( home: InsertContact(), ); } }
insert_contact.dart
import 'package:flutter/material.dart'; import 'package:flutter_contacts/contact.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; class InsertContact extends StatefulWidget { const InsertContact({super.key}); @override State<InsertContact> createState() => _InsertContactState(); } class _InsertContactState extends State<InsertContact> { @override void initState() { super.initState(); _insertContact(); } Future<void> _insertContact() async { if (!await FlutterContacts.requestPermission()) { } else { final newContact = Contact() ..displayName ='Ehsan Zarei' ..name.first = 'Ehsan' ..name.last = 'Zarei' ..phones = [Phone('123456789')] ..groups= [Group('444', 'Edu')]; await newContact.insert(); print(newContact); } } @override Widget build(BuildContext context) { return const Placeholder(); } }
控制台输出
I/flutter ( 7976): Contact(id=, displayName=Ehsan Zarei, thumbnail=null, photo=null, isStarred=false, name=Name(first=Ehsan, last=Zarei, middle=, prefix=, suffix=, nickname=, firstPhonetic=, lastPhonetic=, middlePhonetic=), phones=[Phone(number=123456789, normalizedNumber=, label=PhoneLabel.mobile, customLabel=, isPrimary=false)], emails=[], addresses=[], organizations=[], websites=[], socialMedias=[], events=[], notes=[], accounts=[], groups=[Group(id=444, name=Edu)])
问题原因与解决方案
原因
直接通过Group('444', 'Edu')创建群组关联无效,系统通讯录中的群组是已存在的实体,flutter_contacts的groups字段仅用于关联系统中已存在的群组对象,而非直接创建或映射自定义群组名称。
解决方案
- 先查询系统中已存在的群组,获取目标群组的真实对象
- 将该对象关联到新联系人的
groups字段 - 若目标群组不存在,需先在系统通讯录中手动创建,或通过原生API创建(flutter_contacts部分版本不支持创建群组)
修改后的_insertContact方法示例:
Future<void> _insertContact() async { if (!await FlutterContacts.requestPermission()) { return; } // 查询系统中所有已存在的群组 List<Group> groups = await FlutterContacts.getGroups(); // 查找名为'Edu'的群组,不存在则返回空对象(此时关联会失败,建议先创建群组) Group? targetGroup = groups.firstWhere( (group) => group.name == 'Edu', orElse: () => Group('', 'Edu'), ); final newContact = Contact() ..displayName ='Ehsan Zarei' ..name.first = 'Ehsan' ..name.last = 'Zarei' ..phones = [Phone('123456789')] ..groups = targetGroup.id.isNotEmpty ? [targetGroup] : []; await newContact.insert(); print(newContact); }
内容的提问来源于stack exchange,提问作者Ehsan zarei
相关产品推荐
相关产品推荐

