Flutter实现从Firestore取日期并调度本地推送通知方案咨询
Flutter实现评估截止日期定时推送提醒方案
核心依赖包
先在pubspec.yaml中添加必要依赖:
dependencies: flutter_local_notifications: ^16.1.0 workmanager: ^0.5.1 cloud_firestore: ^4.15.0 intl: ^0.18.1
步骤1:初始化本地通知与后台任务
在main.dart中完成基础配置,确保App启动时初始化通知服务,并注册后台任务回调:
import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:workmanager/workmanager.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:intl/intl.dart'; FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); void callbackDispatcher() { Workmanager().executeTask((task, inputData) async { await checkAndSendReminders(); return Future.value(true); }); } void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化本地通知 const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); await flutterLocalNotificationsPlugin.initialize(initializationSettings); // 初始化后台任务 await Workmanager().initialize(callbackDispatcher, isInDebugMode: false); // 注册每日重复任务,每天凌晨1点触发 await Workmanager().registerPeriodicTask( 'assessment_reminder_task', 'send_assessment_reminders', frequency: const Duration(days: 1), initialDelay: const Duration(hours: 1), ); runApp(const MyApp()); }
步骤2:Firestore数据拉取与提醒逻辑
实现核心函数,从Firestore获取评估数据,计算日期差并发送对应提醒:
// 发送单个评估提醒 Future<void> sendAssessmentNotification(String title) async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'assessment_reminder_channel', '评估截止提醒', channelDescription: '推送评估截止日期提醒', importance: Importance.high, priority: Priority.high, ); const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails); await flutterLocalNotificationsPlugin.show( DateTime.now().millisecondsSinceEpoch % 100000, '评估截止提醒', '$title 即将截止,请尽快完成!', notificationDetails, ); } // 检查所有评估并发送符合条件的提醒 Future<void> checkAndSendReminders() async { DateTime now = DateTime.now(); // 只保留日期部分,忽略时分秒 DateTime today = DateTime(now.year, now.month, now.day); QuerySnapshot snapshot = await FirebaseFirestore.instance.collection('assessments').get(); for (var doc in snapshot.docs) { Map<String, dynamic> data = doc.data() as Map<String, dynamic>; String title = data['title']; Timestamp deadlineTimestamp = data['deadline']; DateTime deadline = deadlineTimestamp.toDate(); DateTime deadlineDate = DateTime(deadline.year, deadline.month, deadline.day); // 计算当前日期与截止日期的天数差 int daysUntilDeadline = deadlineDate.difference(today).inDays; // 符合条件:截止前2天、前1天、当天(共3次提醒) if (daysUntilDeadline >= 0 && daysUntilDeadline <= 2) { await sendAssessmentNotification(title); } } }
步骤3:添加评估时的即时检查(可选)
如果用户刚添加完评估,希望立即检查是否需要触发提醒(比如添加时已经是截止前2天),可以在添加评估的函数末尾调用检查逻辑:
Future<void> addAssessment(Map<String, dynamic> assessmentData) async { await FirebaseFirestore.instance.collection('assessments').add(assessmentData); // 立即检查是否需要发送提醒 await checkAndSendReminders(); }
平台配置注意事项
Android:
- 在
android/app/src/main/AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> - 首次启动App会自动创建通知渠道,无需额外配置。
- 在
iOS:
- 在
ios/Runner/Info.plist中添加后台模式权限:<key>UIBackgroundModes</key> <array> <string>fetch</string> <string>processing</string> </array> - 启动时申请通知权限:
await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions( alert: true, badge: true, sound: true, );
- 在
内容的提问来源于stack exchange,提问作者Dasun Dola
相关产品推荐
相关产品推荐

