Flutter项目:表单提交触发推送及邮件回复通知实现方案咨询
Flutter推送通知实现方案(表单提交+邮件触发场景)
一、基础准备:集成Firebase Cloud Messaging(FCM)
FCM是Flutter跨平台推送的主流方案,先完成基础集成:
- 在Firebase控制台创建项目,添加Android和iOS应用,将配置文件(
google-services.json/GoogleService-Info.plist)放到对应项目目录 - 在
pubspec.yaml引入依赖:dependencies: firebase_core: ^2.15.0 firebase_messaging: ^14.6.0 flutter_local_notifications: ^16.1.0 - 初始化FCM并获取设备推送Token(需上传后端关联用户ID,用于定向推送):
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 获取设备Token String? token = await FirebaseMessaging.instance.getToken(); // 将Token上传至后端数据库,关联当前用户ID await _uploadTokenToBackend(token, currentUserId); } Future<void> _uploadTokenToBackend(String? token, String userId) { // 这里替换为你的后端API请求逻辑 return Future.value(); } - 请求用户推送权限:
Future<void> requestNotificationPermission() async { FirebaseMessaging messaging = FirebaseMessaging.instance; NotificationSettings settings = await messaging.requestPermission( alert: true, badge: true, sound: true, ); }
二、场景1:用户提交表单时触发推送通知
根据业务需求选择两种实现方式:
方式1:本地触发(表单提交成功直接展示)
适合无需后端验证的简单场景,用flutter_local_notifications直接弹出本地通知:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; final FlutterLocalNotificationsPlugin _localNotifications = FlutterLocalNotificationsPlugin(); // 初始化本地通知 void initLocalNotifications() async { const AndroidInitializationSettings androidInit = AndroidInitializationSettings('@mipmap/ic_launcher'); const DarwinInitializationSettings iosInit = DarwinInitializationSettings(); const InitializationSettings initSettings = InitializationSettings(android: androidInit, iOS: iosInit); await _localNotifications.initialize(initSettings); } // 表单提交成功后调用此方法 void showFormSuccessNotification() async { const AndroidNotificationDetails androidDetails = AndroidNotificationDetails( 'form_submission_channel', '表单提交通知', importance: Importance.high, priority: Priority.high, ); const DarwinNotificationDetails iosDetails = DarwinNotificationDetails(); const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails, iOS: iosDetails); await _localNotifications.show( 0, '表单提交成功', '你的表单已完成提交,我们会尽快处理', notificationDetails, ); }
方式2:后端触发(推荐,支持后端验证/多设备同步)
- 前端提交表单数据到后端,后端验证通过后,调用FCM API向该用户的设备Token发送通知
- 后端示例(Node.js):
const admin = require('firebase-admin'); admin.initializeApp({ credential: admin.credential.applicationDefault() }); // 根据用户ID获取存储的设备Token async function getUserToken(userId) { // 替换为你的数据库查询逻辑 const user = await db.collection('users').doc(userId).get(); return user.data()?.fcmToken; } // 发送表单提交成功的推送通知 async function sendFormSuccessPush(userId) { const token = await getUserToken(userId); if (!token) return; const message = { notification: { title: '表单提交成功', body: '你的表单已完成提交,我们会尽快处理' }, token: token }; try { await admin.messaging().send(message); console.log('推送通知发送成功'); } catch (err) { console.error('推送发送失败:', err); } }
三、场景2:发送邮件时触发推送通知
核心逻辑是后端在发送邮件的流程中,同步调用推送服务API,步骤如下:
- 后端完成邮件发送逻辑(可使用Nodemailer、SendGrid等工具)
- 在邮件发送成功的回调中,调用FCM API向目标用户发送推送通知
- 后端示例(Node.js,承接上述FCM代码):
const nodemailer = require('nodemailer'); // 发送邮件并同步推送通知 async function sendEmailWithPush(userId, emailData) { // 1. 配置邮件发送器 const transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'your-email@example.com', pass: 'your-app-password' } }); const mailOptions = { from: 'your-email@example.com', to: await getUserEmail(userId), subject: emailData.subject, text: emailData.content }; try { // 发送邮件 await transporter.sendMail(mailOptions); console.log('邮件发送成功'); // 2. 同步发送推送通知 await sendEmailRelatedPush(userId, emailData.subject); } catch (err) { console.error('邮件或推送发送失败:', err); } } // 发送邮件关联的推送通知 async function sendEmailRelatedPush(userId, emailSubject) { const token = await getUserToken(userId); if (!token) return; const message = { notification: { title: '你收到一封新邮件', body: `主题:${emailSubject}` }, token: token }; await admin.messaging().send(message); }
四、额外注意事项
- 前台通知处理:APP在前台运行时,FCM默认不会弹出通知,需监听
onMessage事件手动展示:FirebaseMessaging.onMessage.listen((RemoteMessage message) { RemoteNotification? notification = message.notification; if (notification != null) { _localNotifications.show( notification.hashCode, notification.title, notification.body, const NotificationDetails( android: AndroidNotificationDetails( 'default_channel', '默认通知', ), ), ); } }); - iOS特殊配置:在
Info.plist中添加推送权限配置,开启后台模式的推送选项 - Token更新处理:FCM Token可能会变化,需监听
onTokenRefresh事件及时更新后端存储:FirebaseMessaging.instance.onTokenRefresh.listen((newToken) { _uploadTokenToBackend(newToken, currentUserId); });
内容的提问来源于stack exchange,提问作者Saleem Yasin
相关产品推荐
相关产品推荐

