Flutter桌面应用如何实现消息通知

在开发Flutter桌面应用时,如何实现消息通知功能?目前官方文档主要针对移动端,桌面端的通知支持不太清晰。是否有成熟的插件或方案可以实现类似系统托盘通知的效果?具体需要哪些依赖和权限配置?在Windows、macOS和Linux上的实现方式是否有差异?希望有实际经验的开发者能分享具体代码示例或最佳实践。

2 回复

Flutter桌面应用可通过以下方式实现消息通知:

  1. 使用系统原生API(Windows用win32,macOS用macOS,Linux用dart_udev)。
  2. 集成第三方库如flutter_local_notifications,支持跨平台。
  3. 调用系统托盘通知,结合tray_manager等插件。 需注意不同平台的权限配置。

更多关于Flutter桌面应用如何实现消息通知的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter桌面应用中实现消息通知,可以通过以下方式:

1. 使用系统原生通知

Windows平台

import 'package:win32/win32.dart';

void showWindowsNotification(String title, String message) {
  final hwnd = GetConsoleWindow();
  final toast = ToastNotificationManager.createToastNotifier();
  
  final xml = '''
  <toast>
    <visual>
      <binding template="ToastGeneric">
        <text>$title</text>
        <text>$message</text>
      </binding>
    </visual>
  </toast>
  ''';

  final document = Windows.Data.Xml.Dom.XmlDocument()
    ..loadXml(xml);
  
  toast.show(document);
}

macOS平台

import 'dart:io';

void showMacNotification(String title, String message) {
  Process.run('osascript', [
    '-e',
    'display notification "$message" with title "$title"'
  ]);
}

Linux平台

import 'dart:io';

void showLinuxNotification(String title, String message) {
  Process.run('notify-send', [title, message]);
}

2. 使用跨平台插件

推荐使用 flutter_local_notifications 插件:

dependencies:
  flutter_local_notifications: ^16.3.0
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin notificationsPlugin =
    FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  const initializationSettings = InitializationSettings(
    linux: LinuxInitializationSettings(
      defaultActionName: 'Open notification',
    ),
  );

  await notificationsPlugin.initialize(initializationSettings);
}

Future<void> showNotification(String title, String body) async {
  const notificationDetails = NotificationDetails(
    linux: LinuxNotificationDetails(
      urgency: LinuxNotificationUrgency.normal,
    ),
  );

  await notificationsPlugin.show(
    0,
    title,
    body,
    notificationDetails,
  );
}

3. 完整示例

class NotificationService {
  static final _notifications = FlutterLocalNotificationsPlugin();

  static Future<void> initialize() async {
    const settings = InitializationSettings(
      linux: LinuxInitializationSettings(
        defaultActionName: 'Open',
      ),
    );

    await _notifications.initialize(settings);
  }

  static Future<void> showNotification({
    required String title,
    required String body,
  }) async {
    const details = NotificationDetails(
      linux: LinuxNotificationDetails(
        urgency: LinuxNotificationUrgency.normal,
      ),
    );

    await _notifications.show(
      DateTime.now().millisecondsSinceEpoch ~/ 1000,
      title,
      body,
      details,
    );
  }
}

使用方式:

// 初始化
await NotificationService.initialize();

// 显示通知
await NotificationService.showNotification(
  title: '新消息',
  body: '您有一条新消息待查看',
);

注意事项:

  • 不同平台的通知样式和行为可能有所差异
  • 需要处理用户点击通知后的回调
  • 在Linux上可能需要安装 libnotify
  • 测试时请确保在对应的桌面平台上运行

推荐使用 flutter_local_notifications 插件,它提供了统一的API并处理了平台差异。

回到顶部