FlutterFlow实现设备联系人获取与Firebase存储功能遇问题求助
FlutterFlow 获取设备联系人并存储至Firebase的问题
我正在用FlutterFlow开发功能,需求是获取用户设备上的所有联系人,保存后在列表视图中展示。目前已添加对应依赖、申请必要权限并编写了自定义Action代码,但遇到了问题。
自定义Action代码
// Automatic FlutterFlow imports import '/backend/backend.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/custom_code/actions/index.dart'; // Imports other custom actions import '/flutter_flow/custom_functions.dart'; // Imports custom functions import 'package:flutter/material.dart'; // Begin custom action code // DO NOT REMOVE OR MODIFY THE CODE ABOVE! import 'package:contacts_service/contacts_service.dart'; Future buscarContactos(String? userId) async { // Add your function code here! List<Contact> contacts = await ContactsService.getContacts(); final instance = FirebaseFireStore.instance; CollectionReference collection = instance.collection('users').doc(userId).collection('contacts'); late Map<String, dynamic> data; if (contacts != null) data = { 'contacts': contacts .map((k) => { if (k.displayName != null) 'name': k.displayName, if (k.emails!.isNotEmpty && k.emails != null) 'email': k.emails?.first.value, if (k.phones!.isNotEmpty && k.phones != null) 'phone': k.phones?.first.value .toString() .replaceAll(new RegExp(r"\s\b|\b\s"), "") .replaceAll(new RegExp(r'[^\w\s]+'), '') .replaceAll(new RegExp(r'/^(?!\s*$).+/'), "") }) .toList(), }; collection .doc(userId) .set(data) .then((value) => print("Contacts Updated")) .catchError((error) => print("Failed to update Contacts: $error")); return userId; }
代码问题与修复方案
- Firebase类名拼写错误:
FirebaseFireStore需改为FirebaseFirestore(注意小写s),否则无法正确初始化Firebase实例。 - 空安全判断顺序错误:处理
k.emails和k.phones时,需先判断是否为null,再检查是否非空,否则会触发空指针异常。例如将if (k.emails!.isNotEmpty && k.emails != null)调整为if (k.emails != null && k.emails!.isNotEmpty)。 - 正则表达式无效:最后一个正则
r'/^(?!\s*$).+/'多了首尾的/,且用replaceAll会清空有效手机号内容,建议删除该正则,仅保留清理空格和非数字字符的逻辑。 - 冗余空判断:
ContactsService.getContacts()返回的是List<Contact>类型,不会为null,无需判断contacts != null。 - 缺失权限检查:代码未在获取联系人前验证权限是否授予,需添加权限请求逻辑,避免权限未开启时抛出异常。
- 存储结构优化:当前将所有联系人存入单个文档,联系人较多时会影响读取效率,建议将每个联系人单独存储为
contacts集合下的文档,便于后续列表展示与分页。
修复后的代码示例
// Automatic FlutterFlow imports import '/backend/backend.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/custom_code/actions/index.dart'; // Imports other custom actions import '/flutter_flow/custom_functions.dart'; // Imports custom functions import 'package:flutter/material.dart'; // Begin custom action code // DO NOT REMOVE OR MODIFY THE CODE ABOVE! import 'package:contacts_service/contacts_service.dart'; import 'package:permission_handler/permission_handler.dart'; Future buscarContactos(String? userId) async { // 请求并检查联系人权限 PermissionStatus status = await Permission.contacts.request(); if (status.isDenied || status.isPermanentlyDenied) { print("联系人权限未授予,无法获取联系人"); return userId; } // 获取设备联系人列表 List<Contact> contacts = await ContactsService.getContacts(); final instance = FirebaseFirestore.instance; CollectionReference contactsCollection = instance.collection('users').doc(userId).collection('contacts'); // 批量写入联系人数据(每个联系人单独存为文档) WriteBatch batch = instance.batch(); for (var contact in contacts) { Map<String, dynamic> contactData = {}; if (contact.displayName != null) { contactData['name'] = contact.displayName; } if (contact.emails != null && contact.emails!.isNotEmpty) { contactData['email'] = contact.emails!.first.value; } if (contact.phones != null && contact.phones!.isNotEmpty) { // 清理手机号格式:去除空格、保留数字和+号 String cleanPhone = contact.phones!.first.value.toString() .replaceAll(RegExp(r"\s+"), "") .replaceAll(RegExp(r'[^\d+]'), ''); contactData['phone'] = cleanPhone; } // 仅存储有有效数据的联系人 if (contactData.isNotEmpty) { batch.set(contactsCollection.doc(), contactData); } } // 提交批量操作 await batch.commit() .then((_) => print("联系人保存成功")) .catchError((error) => print("保存失败:$error")); return userId; }
列表展示说明
如果采用单个联系人对应单个文档的存储方式,在FlutterFlow中直接将列表视图绑定到users/{userId}/contacts集合即可展示所有联系人;若保留原数组存储结构,则需先读取对应文档,解析出contacts数组后再绑定到列表。
内容的提问来源于stack exchange,提问作者Sergio Rodríguez Martínez
相关产品推荐
相关产品推荐

