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

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('通知测试'))),
    );
  }
}

额外依赖配置

  1. 在pubspec.yaml中添加依赖:
dependencies:
  flutter_local_notifications: ^16.1.0 # 使用最新稳定版
  permission_handler: ^11.0.1 # 处理权限申请
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:46:08