Flutter 中结合 Firestore 检测新日期到来并触发指定函数的实现方法
Flutter Firestore 零点自动触发函数实现方案
方案1:Cloud Firestore 云函数定时触发(最稳定,优先推荐)
该方案为服务端触发,不依赖前端App运行状态,不会出现漏执行情况,可保证数据全局一致性:
- 基于Cloud Functions for Firebase的定时触发器,直接设定每天指定时区的零点执行即可,参考代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 时区参数根据你的业务区域调整,中国区设为Asia/Shanghai exports.dailyDataShift = functions.pubsub.schedule('0 0 * * *') .timeZone('Asia/Shanghai') .onRun(async (context) => { const db = admin.firestore(); // 此处直接调用你已开发完成的数值下移逻辑即可 console.log('每日零点任务执行完成'); return null; });
方案2:Flutter 前端端内触发(仅适合用户打开App时才需要同步的场景)
如果你的逻辑仅需用户在端内操作时同步更新,不需要后台静默执行,可以用该方案:
- 第一步:在Firestore新增
global_config集合,存储last_executed_date字段作为全局标记,记录上次任务执行的日期,格式为YYYY-MM-DD - 第二步:在Flutter应用启动、切回前台时触发日期校验逻辑,对比当前日期和上次执行日期,不一致则执行你的业务函数,参考Dart代码:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:intl/intl.dart'; Future<void> checkDailyTask() async { String currentDate = DateFormat('yyyy-MM-dd').format(DateTime.now()); final taskDoc = await FirebaseFirestore.instance.collection('global_config').doc('daily_task').get(); String lastExecutedDate = taskDoc.data()?['last_executed_date'] ?? ''; if (currentDate != lastExecutedDate) { // 调用你已开发完成的数值下移函数 await yourCustomShiftFunction(); // 更新全局执行标记 await FirebaseFirestore.instance.collection('global_config').doc('daily_task').set({ 'last_executed_date': currentDate }, SetOptions(merge: true)); } }
- 第三步:如果需要App前台运行时到点自动触发,可以新增零点定时监听:
void registerMidnightListener() { final now = DateTime.now(); final nextMidnight = DateTime(now.year, now.month, now.day + 1); final timeToMidnight = nextMidnight.difference(now); Timer(timeToMidnight, () { checkDailyTask(); // 执行完成后重新注册下一天的定时 registerMidnightListener(); }); }
- 注意:该方案需要额外增加并发锁逻辑,避免多个用户同时打开App时重复触发任务。
触发效果参考
11:59 PM 未触发状态
12:00 AM 触发完成后状态
内容的提问来源于stack exchange,提问作者Mohammad Abd-Elmoniem
相关产品推荐
相关产品推荐

