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

Flutter使用flutter_local_notifications定时触发通知失败求助

flutter_local_notifications定时通知不触发排查方案

1. 先修复现有代码语法错误

你提供的代码存在多处语法不闭合、多余符号的问题,先修正如下:

tz.TZDateTime _nextInstanceOf423PM() {
  final tz.TZDateTime now = tz.TZDateTime.now(tz.local);
  tz.TZDateTime scheduledDate =
      tz.TZDateTime(tz.local, now.year, now.month, now.day, 16, 23); // 去掉多余的右括号
  if (scheduledDate.isBefore(now)) {
    scheduledDate = scheduledDate.add(const Duration(days: 1));
  }
  return scheduledDate;
} // 补充函数闭合大括号

Future<void> displayNotification() async {
  await notificationsPlugin.zonedSchedule(
    0,
    "Wake Up",
    'Time to wake up now',
    _nextInstanceOf423PM(),
    NotificationDetails(
      android: AndroidNotificationDetails(
          'channel_id', 'channel_name', 'channel_description'), // 建议通道ID不要带空格,避免异常
    ),
    uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime,
    androidAllowWhileIdle: true,
    matchDateTimeComponents: DateTimeComponents.time, // 如果需要每天同一时间重复触发,必须加这个参数
  ); // 补充方法闭合括号
} // 补充函数闭合大括号

2. 检查时区初始化配置

定时通知依赖时区库的正确初始化,必须在应用启动时完成如下配置:

  • 入口main函数中要初始化时区绑定,获取本地时区:
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化时区数据
  tz.initializeTimeZones();
  // 设置本地时区
  tz.setLocalLocation(tz.getLocation(await FlutterNativeTimezone.getLocationName()));
  // 后续初始化notification插件等逻辑
  runApp(const MyApp());
}

注意:需要额外安装flutter_native_timezone包获取设备真实本地时区,直接用tz.local可能出现时区偏移错误

3. 检查Android端权限配置

  • Android 13(API 33)及以上版本必须申请POST_NOTIFICATIONS权限,没有通知权限无法弹出通知
  • Android 12(API 31)及以上版本要触发精确时间的定时通知,必须申请SCHEDULE_EXACT_ALARM权限,需要在AndroidManifest.xml中添加如下声明:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <!-- 如果需要设备重启后仍保留定时通知,加这个权限 -->
  • 首次创建通知通道后,如果修改了通道的优先级、声音等配置,需要卸载重装应用才会生效,测试时可以先更换通道ID验证。

4. 测试验证方法

可以先把定时时间改成当前时间之后1~2分钟,直接运行测试,不要用热重载,热重载不会重新注册定时任务。

内容的提问来源于stack exchange,提问作者Shashwat Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 00:54:02