Android端Flutter每日定时本地通知实现及测试问题
Android每日定时本地通知不生效问题修复及模拟器测试方法
问题定位
你的代码存在几个关键问题导致通知未触发:
periodicallyShow方法未传入指定的每日触发时间(你定义了Time变量但未使用)- 调用
periodicallyShow时传入了硬编码的'title'和'body',而非方法参数的title和body - 未处理Android 13及以上版本的通知权限申请
修复后的代码
notification_service.dart
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:permission_handler/permission_handler.dart'; class NotificationServices { FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); final AndroidInitializationSettings _androidInitializationSettings = AndroidInitializationSettings('logo1'); void initialiseNotifications() async { // Android 13+ 申请通知权限 if (await Permission.notification.isDenied) { await Permission.notification.request(); } InitializationSettings initializationSettings = InitializationSettings( android: _androidInitializationSettings, ); await _flutterLocalNotificationsPlugin.initialize(initializationSettings); } void scheduleNotifications(String title, String body) async { // 指定每日触发时间:19:05:20 final time = Time(19, 5, 20); AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails( 'channelId', 'channelName', importance: Importance.max, priority: Priority.high, channelDescription: '每日待办提醒通道', ); NotificationDetails notificationDetails = NotificationDetails( android: androidNotificationDetails, ); // 调用periodicallyShow时传入指定时间、动态标题和内容 await _flutterLocalNotificationsPlugin.periodicallyShow( 0, title, body, RepeatInterval.daily, notificationDetails, time: time, // 关键:传入每日触发的时间点 ); } void stopNotifications() async { await _flutterLocalNotificationsPlugin.cancel(0); } }
main.dart
import 'package:flutter/material.dart'; import 'notification_service.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 必须添加,确保初始化前绑定Flutter引擎 NotificationServices notificationServices = NotificationServices(); await notificationServices.initialiseNotifications(); // 等待初始化完成 notificationServices.scheduleNotifications('每日提醒', '你还有待办事项需要完成'); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.blue), home: const Scaffold(body: Center(child: Text('通知测试'))), ); } }
额外依赖配置
- 在
pubspec.yaml中添加依赖:
dependencies: flutter_local_notifications: ^16.1.0 # 使用最新稳定版 permission_handler: ^11.0.1 # 处理权限申请
- AndroidManifest.xml配置:
- 在
<manifest>标签内添加权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- 在
<application>标签内添加通知图标配置(确保logo1.png在res/drawable目录下):
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/logo1" />
Android模拟器测试方法
修改设备日期和时间完全可行,测试步骤如下:
- 启动应用,确保通知已成功调度
- 打开模拟器的系统设置,进入「日期和时间」,关闭「自动设置日期和时间」
- 将时间调整到目标触发时间的1-2分钟前(比如目标是19:05,就调到19:03)
- 回到主屏幕或后台等待,当时间到达设定点时,通知会正常触发
- 测试完成后记得打开「自动设置日期和时间」,避免影响其他功能
注意:部分模拟器可能需要将应用退到后台(或锁定屏幕)才能触发通知,建议测试时模拟真实使用场景。
内容的提问来源于stack exchange,提问作者iamrishan
相关产品推荐
相关产品推荐

