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

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:后端触发(推荐,支持后端验证/多设备同步)

  1. 前端提交表单数据到后端,后端验证通过后,调用FCM API向该用户的设备Token发送通知
  2. 后端示例(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,步骤如下:

  1. 后端完成邮件发送逻辑(可使用Nodemailer、SendGrid等工具)
  2. 在邮件发送成功的回调中,调用FCM API向目标用户发送推送通知
  3. 后端示例(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:22