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

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:

    1. 在android/app/src/main/AndroidManifest.xml中添加权限:
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
      <uses-permission android:name="android.permission.WAKE_LOCK"/>
      
    2. 首次启动App会自动创建通知渠道,无需额外配置。
  • iOS:

    1. 在ios/Runner/Info.plist中添加后台模式权限:
      <key>UIBackgroundModes</key>
      <array>
        <string>fetch</string>
        <string>processing</string>
      </array>
      
    2. 启动时申请通知权限:
      await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(
        alert: true,
        badge: true,
        sound: true,
      );
      

内容的提问来源于stack exchange,提问作者Dasun Dola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:03:34