基于Flutter与MySQL数据库的移动应用:如何实现指定数据表新增数据时向APP推送通知
嘿,这个需求我帮不少开发者落地过——MySQL本身没法直接给Flutter app发推送,得靠中间层把数据库的变化同步到客户端。下面给你三个不同场景下的靠谱方案,你按需选:
方案1:WebSocket 实时推送(推荐,实时性最高)
如果你的需求是秒级实时通知,WebSocket是最优解。核心思路是让Flutter客户端和后端保持长连接,当MySQL有新数据时,后端立刻推送给客户端。
具体步骤:
- 后端搭建WebSocket服务:用Node.js、Java或Python都行,比如Node.js的
ws库,Python的websockets。 - 联动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配置。
- 方法A:给目标表加MySQL触发器,当有新数据插入时,调用后端的接口通知新数据事件。
- 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)。
具体步骤:
- Flutter端集成FCM:获取设备的推送令牌(token),并上传到你的后端保存。
- 后端监听MySQL新数据:同样用触发器或业务逻辑触发,当有新数据时,调用FCM的API给对应的设备发送推送。
- 后端调用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); } - Flutter端处理FCM通知:监听FCM的消息,不管前台还是后台都能触发通知。
注意事项:
- 触发器方案要注意MySQL的权限限制,有些云数据库(比如阿里云RDS)可能禁用了UDF,这时候优先用业务逻辑触发推送。
- WebSocket要做好重连机制,避免网络波动导致断开后收不到通知。
- 本地通知需要在Android和iOS上配置相应的权限,比如iOS要开启推送权限,Android要申请POST_NOTIFICATIONS权限。
内容的提问来源于stack exchange,提问作者aditya-magdum
相关产品推荐
相关产品推荐

