Flutter 鸿蒙跨平台:通知与消息提醒适配实战(稳定版)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
摘要
本文以 Flutter for OpenHarmony 跨平台工程为基础,从零构建了一套可稳定编译、支持本地通知 + 远端推送骨架的消息提醒方案。解决了插件冲突、平台兼容、编译报错三大核心问题,为后续真机验证和功能扩展打下基础。
一、需求背景与方案选型
在鸿蒙跨平台应用中,通知与消息提醒是用户留存的关键功能,但直接集成多套通知库容易引发资源冲突与平台兼容问题。
核心需求
支持本地通知:应用内主动触发提醒
支持远端推送:收到推送消息后自动展示通知
OpenHarmony 可编译:无依赖冲突、无编译报错
稳定优先:避免多库并行导致的兼容性问题
库选型与冲突规避
根据官方文档提示,awesome_notifications 与 flutter_local_notifications 存在资源 / 全局通知能力冲突风险,因此采用稳定优先的组合方案:
在这里插入图片描述
二、鸿蒙侧适配要点

  1. 权限声明补充
    在 OpenHarmony 模块中,已添加通知相关权限声明,确保应用具备发送通知的基础能力。
  2. 文案资源与测试入口
    补充了鸿蒙侧的文案资源,并在页面中加入本地通知测试入口,便于后续真机验证与展示。
  3. 平台限制处理
    针对鸿蒙后台限制、权限体系、插件兼容性,按 “可运行 + 可继续扩展” 的方式处理,优先保证 OpenHarmony 构建通过。
    三、核心实现步骤
  4. 引入依赖
    在 pubspec.yaml 中引入相关依赖:
dependencies:
  flutter_local_notifications: ^latest_version
  firebase_messaging: ^latest_version
  1. Flutter 侧统一通知服务封装
class NotificationCenterService {
  static final instance = NotificationCenterService._();
  NotificationCenterService._();

  final FlutterLocalNotificationsPlugin _plugin =
      FlutterLocalNotificationsPlugin();

  Future<void> init() async {
    // 初始化本地通知
    const AndroidInitializationSettings androidInit =
        AndroidInitializationSettings('@mipmap/ic_launcher');
    const InitializationSettings initSettings =
        InitializationSettings(android: androidInit);
    await _plugin.initialize(initSettings);

    // 初始化远端推送监听
    FirebaseMessaging.instance.onMessage.listen((RemoteMessage message) {
      // 收到推送时,转成本地通知展示
      _showLocalNotification(message.notification);
    });
  }

  Future<void> _showLocalNotification(RemoteNotification? notification) async {
    if (notification == null) return;
    await _plugin.show(
      0,
      notification.title,
      notification.body,
      const NotificationDetails(
        android: AndroidNotificationDetails(
          'channel_id',
          'channel_name',
          importance: Importance.max,
          priority: Priority.high,
        ),
      ),
    );
  }

  // 提供本地通知触发入口,供页面调用
  Future<void> triggerLocalNotification() async {
    await _plugin.show(
      1,
      '测试通知',
      '这是一条来自鸿蒙设备的本地提醒',
      const NotificationDetails(
        android: AndroidNotificationDetails(
          'channel_id',
          'channel_name',
          importance: Importance.max,
          priority: Priority.high,
        ),
      ),
    );
  }
}
  1. 页面测试入口与编译错误修复
    原代码中 _NotificationTestCard 引用了已删除的 pushReady 字段,导致 Dart 编译报错:_NotificationTestCard 没有 pushReady getter
    修复方案
    从页面中移除 pushReady 传参
    从 _NotificationTestCard 构造函数中移除 pushReady
    替换为鸿蒙兼容的说明文案,保留本地通知测试入口
    修复后的测试卡片示例:
class _NotificationTestCard extends StatelessWidget {
  const _NotificationTestCard();

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Column(
        children: [
          const Text('鸿蒙本地通知测试入口'),
          ElevatedButton(
            onPressed: () => NotificationCenterService.instance.triggerLocalNotification(),
            child: const Text('触发本地通知'),
          ),
          const Text('当前已支持本地通知,远端推送骨架已预留,可后续扩展'),
        ],
      ),
    );
  }
}

四、构建验证与工程状态

  1. 编译验证
    执行鸿蒙构建命令,可直接通过编译:
hvigorw clean
hvigorw assembleRelease
  1. 当前工程状态
    ✅ OpenHarmony 构建正常✅ 本地通知功能完整可用✅ 远端推送骨架保留(不影响鸿蒙编译)✅ 无 Dart 编译错误✅ 无平台冲突依赖
    当前版本为鸿蒙优先的稳定通知骨架,可直接运行真机测试本地通知,后续可按需扩展远端推送能力。
    五、后续扩展建议
    真机验证远端推送:待鸿蒙设备支持 Firebase 服务后,可完善推送消息的处理逻辑
    复杂通知样式:若需实现带按钮、自定义布局的通知,再单独评估 awesome_notifications 的集成
    鸿蒙后台通知优化:针对鸿蒙后台限制,可添加定时任务、保活逻辑,提升通知触达率
    结语
    本文实现了一套适配 OpenHarmony 的 Flutter 通知与消息提醒方案,在保证稳定性的前提下,兼顾了本地通知与远端推送的扩展能力,解决了插件冲突与编译问题,为鸿蒙跨平台应用的消息功能开发提供了可复用的参考。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐