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

Flutter Local Notification无法在设备屏幕显示问题求助

解决Flutter本地通知不显示的问题

针对你开发待办应用时遇到的flutter_local_notifications插件通知不显示问题,结合你的代码和配置,整理以下修复步骤:

1. 调整时区初始化顺序

你的main函数中先初始化通知、后初始化时区,会导致zonedSchedule无法正确识别时区,修改执行顺序:

void main(List<String> args) async {
  WidgetsFlutterBinding.ensureInitialized();
  // 先初始化时区
  tz.initializeTimeZones();
  await LocalNotifications.init();
  await Hive.initFlutter();

  Hive.registerAdapter(TaskAdapter());
  await Hive.openBox('myToDoBox');

  UserOrient.configure(
    apiKey: 'b0841b71-e5b0-4b78-baa6-bd3b32815afb',
    languageCode: 'en',
  );

  runApp(
    const ProviderScope(
      child: ToDoApp(),
    ),
  );
}

2. 避免固定通知ID导致覆盖

scheduleNotification方法中固定使用ID=0,每次创建任务都会覆盖之前的定时通知,改成动态生成唯一ID:

static Future<void> scheduleNotification(
    String title, String body, DateTime scheduledData) async {
  // 用时间戳生成唯一ID
  final int notificationId = DateTime.now().millisecondsSinceEpoch ~/ 1000;
  const NotificationDetails platformChannelSpecifics = NotificationDetails(
    android: AndroidNotificationDetails("channel_Id", "channel_Name",
        importance: Importance.high, priority: Priority.high),
    iOS: DarwinNotificationDetails(),
  );

  await flutterLocalNotificationsPlugin.zonedSchedule(notificationId, title, body,
      tz.TZDateTime.from(scheduledData, tz.local), platformChannelSpecifics,
      uiLocalNotificationDateInterpretation:
          UILocalNotificationDateInterpretation.absoluteTime);
}

3. 显式创建Android通知渠道

Android 8.0及以上必须创建通知渠道才能显示通知,在LocalNotifications.init()中添加渠道创建逻辑:

static Future<void> init() async {
  const AndroidInitializationSettings androidInitializationSettings =
      AndroidInitializationSettings("@mipmap/ic_launcher");

  // 配置iOS权限申请
  const DarwinInitializationSettings iosInitalizationSettings =
      DarwinInitializationSettings(
    requestAlertPermission: true,
    requestBadgePermission: true,
    requestSoundPermission: true,
  );

  const InitializationSettings initializationSettings =
      InitializationSettings(
    android: androidInitializationSettings,
    iOS: iosInitalizationSettings,
  );

  await flutterLocalNotificationsPlugin.initialize(
    initializationSettings,
    onDidReceiveBackgroundNotificationResponse: onDidReceiveNotification,
    onDidReceiveNotificationResponse: onDidReceiveNotification,
  );

  // 创建Android通知渠道
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    "channel_Id",
    "channel_Name",
    description: "待办任务通知渠道",
    importance: Importance.high,
  );
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
      ?.requestNotificationsPermission();
}

4. 补充iOS权限配置

在iOS的Info.plist中添加权限描述(Xcode中打开Info.plist添加):

<key>NSAlertUsageDescription</key>
<string>需要通知权限来提醒您的待办任务</string>
<key>NSBadgeUsageDescription</key>
<string>需要徽章权限来显示待办任务数量</string>
<key>NSSoundUsageDescription</key>
<string>需要声音权限来提醒您的待办任务</string>

5. 添加错误捕获与日志

在scheduleNotification中添加异常捕获,方便排查问题:

static Future<void> scheduleNotification(
    String title, String body, DateTime scheduledData) async {
  try {
    final int notificationId = DateTime.now().millisecondsSinceEpoch ~/ 1000;
    const NotificationDetails platformChannelSpecifics = NotificationDetails(
      android: AndroidNotificationDetails("channel_Id", "channel_Name",
          importance: Importance.high, priority: Priority.high),
      iOS: DarwinNotificationDetails(),
    );

    await flutterLocalNotificationsPlugin.zonedSchedule(notificationId, title, body,
        tz.TZDateTime.from(scheduledData, tz.local), platformChannelSpecifics,
        uiLocalNotificationDateInterpretation:
            UILocalNotificationDateInterpretation.absoluteTime);
    print("定时通知已成功调度,ID: $notificationId");
  } catch (e) {
    print("调度通知失败: $e");
  }
}

6. 验证通知触发时机

暂时注释掉Navigator.pop(context),测试通知是否能正常显示,排除页面跳转导致的触发中断问题。

内容的提问来源于stack exchange,提问作者Rufat Shikhiyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:19:50