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

Flutter中如何在函数内获取SQLite联系人列表供Twilio发信使用?

实现方案

一、现有SQLite方案实现步骤

你已完成的SQLite实现中会包含统一的DatabaseHelper操作类,首先在该类中补充查询全量联系人的方法:

// 新增到DatabaseHelper类中
Future<List<Map<String, dynamic>>> getAllContacts() async {
  final db = await instance.database;
  return db.query('contacts'); // 表名替换为你实际的联系人表名
}
// 如果你已经封装了联系人实体类,可以直接返回实体列表
Future<List<Contact>> getAllContactEntities() async {
  final db = await instance.database;
  final List<Map<String, dynamic>> maps = await db.query('contacts');
  return List.generate(maps.length, (i) {
    return Contact(
      id: maps[i]['id'],
      name: maps[i]['name'],
      phone: maps[i]['phone'], // 字段名替换为你建表时的电话号码字段名
    );
  });
}

之后在Twilio函数所在的独立文件中,导入DatabaseHelper,修改发送函数如下:

import '你的实际路径/database_helper.dart'; // 替换为DatabaseHelper文件的实际路径

void sendSms(String messageBody) async {
  // 1. 从SQLite拉取所有联系人数据
  final List<Contact> contacts = await DatabaseHelper.instance.getAllContactEntities();
  // 2. 遍历批量发送
  for (var contact in contacts) {
    // 电话号码需要符合Twilio格式要求,必须带国际区号前缀,比如中国号码需加+86
    if (contact.phone.isNotEmpty) {
      try {
        await twilioFlutter.sendSMS(
          toNumber: contact.phone, 
          messageBody: messageBody
        );
        // 加延迟避免触发Twilio频率限制
        await Future.delayed(const Duration(milliseconds: 500));
      } catch(e) {
        // 可自行添加单条发送失败的日志打印/容错逻辑
        print('号码${contact.phone}发送失败:$e');
      }
    }
  }
}
  • 注意事项:
    • 提前校验本地存储的电话号码格式,避免因格式问题触发Twilio接口报错
    • 批量发送的间隔时长可根据Twilio的账号等级调整,避免触发限流

二、切换Firestore的可选实现方案

如果你的应用需要多端同步、云端备份联系人数据,Firestore是更简化的选型,无需维护本地数据库版本升级逻辑:

1. 前置准备

完成Firebase项目配置,在pubspec.yaml中添加cloud_firestore依赖

2. 联系人CRUD示例代码

import 'package:cloud_firestore/cloud_firestore.dart';

class ContactService {
  final CollectionReference contactsRef = FirebaseFirestore.instance.collection('contacts');

  // 新增联系人
  Future<void> addContact(String name, String phone) {
    return contactsRef.add({
      'name': name,
      'phone': phone,
      'createdAt': FieldValue.serverTimestamp(),
    });
  }

  // 获取所有联系人
  Future<List<Contact>> getAllContacts() async {
    final QuerySnapshot snapshot = await contactsRef.get();
    return snapshot.docs.map((doc) {
      return Contact(
        id: doc.id,
        name: doc['name'],
        phone: doc['phone'],
      );
    }).toList();
  }

  // 更新联系人
  Future<void> updateContact(String docId, String newName, String newPhone) {
    return contactsRef.doc(docId).update({
      'name': newName,
      'phone': newPhone
    });
  }

  // 删除联系人
  Future<void> deleteContact(String docId) {
    return contactsRef.doc(docId).delete();
  }
}

3. 适配Twilio发送函数

void sendSmsWithFirestore(String messageBody) async {
  final List<Contact> contacts = await ContactService().getAllContacts();
  for (var contact in contacts) {
    if (contact.phone.isNotEmpty) {
      try {
        await twilioFlutter.sendSMS(
          toNumber: contact.phone, 
          messageBody: messageBody
        );
        await Future.delayed(const Duration(milliseconds: 500));
      } catch(e) {
        print('号码${contact.phone}发送失败:$e');
      }
    }
  }
}
  • Firestore选型优势:
    • 无需处理本地数据库升级、数据迁移逻辑
    • 联系人数据云端存储,卸载重装不会丢失
    • 自带权限控制能力,可灵活配置数据访问规则
    • 支持多端实时同步联系人数据

内容的提问来源于stack exchange,提问作者Max Moe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:27:03