使用flutter_local_notifications插件时如何动态修改通知标题和正文
问题根因
你当前使用的
periodicallyShow方法会在注册定时任务时,就将通知标题、正文等参数固化存储到系统本地,后续每次触发通知时只会调用注册时的静态数据,不会自动执行接口拉取逻辑,因此内容无法更新。
实现动态内容通知的方案
方案1:搭配workmanager实现后台实时拉取(全平台兼容)
该方案支持后台定期执行自定义逻辑,每次触发通知前都会主动拉取后端最新数据,内容实时性最高:
- 先在
pubspec.yaml中添加workmanager依赖,该插件支持跨平台后台定期任务调度 - 初始化后台任务调度器,在任务逻辑中实现「拉取后端数据+推送通知」的完整流程
- 按需配置安卓、iOS的后台运行权限,避免系统拦截后台任务
示例代码:
// 后台任务回调入口 void callbackDispatcher() { Workmanager().executeTask((task, inputData) async { try { // 拉取后端最新通知数据 var res = await http.get(Uri.parse(<REST API ENDPOINT>)); var body = json.decode(res.body); Map notificationData = body['results'][0]; // 推送最新内容的通知 await flutterLocalNotificationsPlugin.show( notificationData['id'], notificationData['title'], notificationData['body'], notificationDetails ); return Future.value(true); } catch (e) { return Future.value(false); } }); } void main() { // 初始化后台任务管理器 Workmanager().initialize( callbackDispatcher, isInDebugMode: false ); // 注册每日执行的定时通知任务,可自定义首次触发时间 Workmanager().registerPeriodicTask( "daily-notification", "fetchAndPushNotification", frequency: const Duration(days: 1), initialDelay: Duration.zero // 按需调整首次触发延迟时间 ); runApp(const MyApp()); }
方案2:启动/前台时刷新定时任务(轻量无额外核心依赖)
如果通知内容更新频率不高,可以不用引入额外插件,每次用户打开APP/APP回到前台时,先取消旧的定时通知,拉取最新数据后重新注册定时任务即可:
// APP启动/回到前台时调用该方法刷新通知 Future<void> refreshDailyNotification() async { const targetNotificationId = 1; // 替换为你的实际通知ID // 先取消已注册的旧定时通知 await flutterLocalNotificationsPlugin.cancel(targetNotificationId); // 拉取最新通知数据 var res = await http.get(Uri.parse(<REST API ENDPOINT>)); var body = json.decode(res.body); Map notificationData = body['results'][0]; // 用最新内容重新注册每日定时通知 await flutterLocalNotificationsPlugin.periodicallyShow( notificationData['id'], notificationData['title'], notificationData['body'], RepeatInterval.daily, notificationDetails ); }
该方案缺点是用户长期不打开APP时,通知内容不会更新,适合低频率更新的场景。
内容的提问来源于stack exchange,提问作者Ibrahim Rehman
相关产品推荐
相关产品推荐

