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

基于Flutter与MySQL数据库的移动应用:如何实现指定数据表新增数据时向APP推送通知

嘿,这个需求我帮不少开发者落地过——MySQL本身没法直接给Flutter app发推送,得靠中间层把数据库的变化同步到客户端。下面给你三个不同场景下的靠谱方案,你按需选:

方案1:WebSocket 实时推送(推荐,实时性最高)

如果你的需求是秒级实时通知,WebSocket是最优解。核心思路是让Flutter客户端和后端保持长连接,当MySQL有新数据时,后端立刻推送给客户端。

具体步骤:

  1. 后端搭建WebSocket服务:用Node.js、Java或Python都行,比如Node.js的ws库,Python的websockets。
  2. 联动MySQL的新数据事件:
    • 方法A:给目标表加MySQL触发器,当有新数据插入时,调用后端的接口通知新数据事件。
      DELIMITER //
      CREATE TRIGGER after_target_table_insert
      AFTER INSERT ON your_target_table
      FOR EACH ROW
      BEGIN
        -- 调用后端接口传递新数据信息(需要MySQL启用HTTP UDF插件,比如mysql-udf-http)
        CALL http_post('http://your-backend-domain/new-data', JSON_OBJECT('id', NEW.id, 'content', NEW.content));
      END //
      DELIMITER ;
      
    • 方法B(更灵活):如果你的后端本身负责插入数据到MySQL,那直接在插入成功的业务逻辑里触发WebSocket推送,不用改MySQL配置。
  3. Flutter端连接WebSocket并监听:
    import 'package:web_socket_channel/web_socket_channel.dart';
    import 'package:flutter_local_notifications/flutter_local_notifications.dart';
    
    final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin();
    late WebSocketChannel _channel;
    
    @override
    void initState() {
      super.initState();
      // 初始化本地通知
      _initNotifications();
      // 连接WebSocket服务
      _channel = WebSocketChannel.connect(Uri.parse('ws://your-backend-domain/ws'));
      // 监听新消息
      _channel.stream.listen((message) {
        // 收到新数据通知,弹出本地通知
        _showNotification('新数据提醒', message);
      }, onError: (error) {
        // 处理连接错误,比如自动重连
        _reconnectWebSocket();
      });
    }
    
    void _initNotifications() async {
      const AndroidInitializationSettings androidSettings = AndroidInitializationSettings('@mipmap/ic_launcher');
      const InitializationSettings settings = InitializationSettings(android: androidSettings);
      await _notificationsPlugin.initialize(settings);
    }
    
    void _showNotification(String title, String body) async {
      const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
        'new_data_channel', '新数据通知',
        importance: Importance.max, priority: Priority.high,
      );
      const NotificationDetails notificationDetails = NotificationDetails(android: androidDetails);
      await _notificationsPlugin.show(0, title, body, notificationDetails);
    }
    
    void _reconnectWebSocket() {
      // 延迟几秒后重新连接
      Future.delayed(const Duration(seconds: 5), () {
        _channel = WebSocketChannel.connect(Uri.parse('ws://your-backend-domain/ws'));
      });
    }
    
    @override
    void dispose() {
      _channel.sink.close();
      super.dispose();
    }
    

方案2:定时轮询(最简单,适合低实时性场景)

如果实时性要求不高(比如几分钟检查一次),这个方案最省心,不用维护长连接。

具体实现:

Flutter端用定时器定时调用后端接口,对比本地缓存的最后一条数据ID,判断是否有新数据:

import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin();
Timer? _pollingTimer;
int _lastDataId = 0; // 本地缓存最后一条数据的ID

@override
void initState() {
  super.initState();
  _initNotifications();
  // 每3分钟轮询一次
  _pollingTimer = Timer.periodic(const Duration(minutes: 3), (_) => _checkNewData());
}

Future<void> _checkNewData() async {
  try {
    final response = await http.get(Uri.parse('http://your-backend-domain/latest-data?lastId=$_lastDataId'));
    if (response.statusCode == 200) {
      List<dynamic> newData = jsonDecode(response.body);
      if (newData.isNotEmpty) {
        // 更新本地最后数据ID
        _lastDataId = newData.last['id'];
        // 弹出通知
        _showNotification('新数据提醒', '新增了${newData.length}条数据');
      }
    }
  } catch (e) {
    // 处理网络错误
    print('轮询出错:$e');
  }
}

// 这里的_initNotifications和_showNotification方法和方案1一致,就不重复写了

@override
void dispose() {
  _pollingTimer?.cancel();
  super.dispose();
}

方案3:结合FCM(适合后台推送场景)

如果需要app在后台甚至杀死状态下也能收到通知,推荐结合Firebase Cloud Messaging(FCM)。

具体步骤:

  1. Flutter端集成FCM:获取设备的推送令牌(token),并上传到你的后端保存。
  2. 后端监听MySQL新数据:同样用触发器或业务逻辑触发,当有新数据时,调用FCM的API给对应的设备发送推送。
  3. 后端调用FCM示例(Node.js):
    const admin = require('firebase-admin');
    admin.initializeApp();
    
    async function sendFCMNotification(deviceToken, newData) {
      const message = {
        notification: {
          title: '新数据提醒',
          body: `新增内容:${newData.content}`
        },
        token: deviceToken
      };
      await admin.messaging().send(message);
    }
    
  4. Flutter端处理FCM通知:监听FCM的消息,不管前台还是后台都能触发通知。

注意事项:

  • 触发器方案要注意MySQL的权限限制,有些云数据库(比如阿里云RDS)可能禁用了UDF,这时候优先用业务逻辑触发推送。
  • WebSocket要做好重连机制,避免网络波动导致断开后收不到通知。
  • 本地通知需要在Android和iOS上配置相应的权限,比如iOS要开启推送权限,Android要申请POST_NOTIFICATIONS权限。

内容的提问来源于stack exchange,提问作者aditya-magdum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:27:34