
欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netFlutter 三方库 flutter_local_notifications 的 OpenHarmony 鸿蒙化适配实践引言在移动应用开发中本地通知是一个非常基础且重要的功能。通过本地通知应用可以在后台向用户发送提醒、提醒用户完成某些操作或者向用户推送重要信息。flutter_local_notifications 作为 Flutter 生态中最流行的本地通知插件以其简洁的 API、丰富的功能和强大的跨平台能力成为众多开发者的首选。随着 OpenHarmony 生态的快速发展如何在 Flutter-OH 项目中顺利集成和使用 flutter_local_notifications 成为开发者关注的重点。本文将详细介绍 flutter_local_notifications 在 OpenHarmony 平台上的适配实践包括环境配置、核心功能使用、通知通道管理以及平台特定的注意事项。一、环境准备与项目初始化1.1 创建 Flutter-OH 项目使用 Flutter 命令行工具创建支持 OpenHarmony 的新项目flutter create--platformsohos flutter_local_notifications_ohcdflutter_local_notifications_oh二、集成 flutter_local_notifications 依赖2.1 添加依赖到 pubspec.yaml在项目的 pubspec.yaml 文件中添加 flutter_local_notifications 和 timezone 依赖dependencies:flutter:sdk:fluttercupertino_icons:^1.0.8flutter_local_notifications:^17.2.1timezone:^0.9.2flutter_local_notifications 库是一个跨平台的本地通知插件内部通过平台通道Method Channel与各平台的原生通知功能进行通信。对于 OpenHarmony 平台该库已经提供了良好的支持。timezone 依赖用于处理定时通知的时区问题。2.2 获取依赖运行以下命令下载并安装依赖包flutter pub get三、flutter_local_notifications 核心功能与 OpenHarmony 适配实践3.1 初始化通知插件flutter_local_notifications 的核心 API 设计简洁明了首先需要初始化通知插件importpackage:flutter_local_notifications/flutter_local_notifications.dart;importpackage:timezone/timezone.dartastz;importpackage:timezone/data/latest.dartastz;voidmain()async{WidgetsFlutterBinding.ensureInitialized();tz.initializeTimeZones();runApp(constMyApp());}FuturevoidinitializeNotifications()async{constandroidSettingsAndroidInitializationSettings(mipmap/ic_launcher);constohosSettingsOHOSInitializationSettings(mipmap/ic_launcher);constinitSettingsInitializationSettings(android:androidSettings,ohos:ohosSettings,);await_notifications.initialize(initSettings,onDidReceiveNotificationResponse:_onNotificationResponse,);}void_onNotificationResponse(NotificationResponseresponse){print(通知被点击:${response.payload});}3.2 发送即时通知发送即时通知是最基本的功能FuturevoidshowNotification()async{constandroidDetailsAndroidNotificationDetails(default_channel_id,默认通知,channelDescription:这是默认通知通道,importance:Importance.high,priority:Priority.high,);constohosDetailsOHOSNotificationDetails(importance:Importance.high,);constnotificationDetailsNotificationDetails(android:androidDetails,ohos:ohosDetails,);await_notifications.show(0,通知标题,通知内容,notificationDetails,payload:notification_payload,);}3.3 发送带声音的通知可以配置通知的声音FuturevoidshowNotificationWithSound()async{constandroidDetailsAndroidNotificationDetails(sound_channel_id,带声音通知,channelDescription:这是带声音的通知通道,importance:Importance.high,priority:Priority.high,playSound:true,);constohosDetailsOHOSNotificationDetails(importance:Importance.high,);constnotificationDetailsNotificationDetails(android:androidDetails,ohos:ohosDetails,);await_notifications.show(0,带声音通知,这条通知带有提示音,notificationDetails,);}3.4 定时通知使用 timezone 库实现定时通知FuturevoidscheduleNotification()async{finalscheduledTimetz.TZDateTime.now(tz.local).add(Duration(seconds:10));constandroidDetailsAndroidNotificationDetails(scheduled_channel_id,定时通知,channelDescription:这是定时通知通道,importance:Importance.high,priority:Priority.high,);constohosDetailsOHOSNotificationDetails(importance:Importance.high,);constnotificationDetailsNotificationDetails(android:androidDetails,ohos:ohosDetails,);await_notifications.zonedSchedule(0,定时通知,这条通知将在10秒后发送,scheduledTime,notificationDetails,androidScheduleMode:AndroidScheduleMode.exactAllowWhileIdle,);}3.5 大文本通知可以发送包含更多内容的通知FuturevoidshowBigTextNotification()async{constandroidDetailsAndroidNotificationDetails(bigtext_channel_id,大文本通知,channelDescription:这是大文本通知通道,importance:Importance.high,priority:Priority.high,styleInformation:BigTextStyleInformation(这是通知的详细内容。\n\n第一行内容...\n第二行内容...\n感谢使用 Flutter 本地通知,contentTitle:大文本通知,summaryText:通知摘要,),);constohosDetailsOHOSNotificationDetails(importance:Importance.high,);constnotificationDetailsNotificationDetails(android:androidDetails,ohos:ohosDetails,);await_notifications.show(0,通知标题,大文本通知已发送,notificationDetails);}3.6 取消通知可以取消单条通知或所有通知// 取消单条通知FuturevoidcancelNotification(int id)async{await_notifications.cancel(id);}// 取消所有通知FuturevoidcancelAllNotifications()async{await_notifications.cancelAll();}四、完整示例应用4.1 主页面实现classHomePageextendsStatefulWidget{constHomePage({super.key});overrideStateHomePagecreateState()_HomePageState();}class_HomePageStateextendsStateHomePage{finalFlutterLocalNotificationsPlugin_notificationsFlutterLocalNotificationsPlugin();String_selectedType普通通知;finalTextEditingController_titleControllerTextEditingController(text:通知标题);finalTextEditingController_bodyControllerTextEditingController(text:这是通知的内容);finalTextEditingController_delayControllerTextEditingController(text:5);int _notificationId0;overridevoidinitState(){super.initState();_initializeNotifications();}Futurevoid_initializeNotifications()async{constandroidSettingsAndroidInitializationSettings(mipmap/ic_launcher);constohosSettingsOHOSInitializationSettings(mipmap/ic_launcher);constinitSettingsInitializationSettings(android:androidSettings,ohos:ohosSettings,);await_notifications.initialize(initSettings,onDidReceiveNotificationResponse:_onNotificationResponse,);await_requestPermissions();}Futurevoid_requestPermissions()async{await_notifications.resolvePlatformSpecificImplementationAndroidFlutterLocalNotificationsPlugin()?.requestNotificationsPermission();}void_onNotificationResponse(NotificationResponseresponse){showDialog(context:context,builder:(context)AlertDialog(title:constText(通知被点击),content:Text(Payload:${response.payload}),actions:[TextButton(onPressed:()Navigator.pop(context),child:constText(确定),),],),);}Futurevoid_showNotification()async{_notificationId;constandroidDetailsAndroidNotificationDetails(default_channel_id,默认通知,channelDescription:这是默认通知通道,importance:Importance.high,priority:Priority.high,);constohosDetailsOHOSNotificationDetails(importance:Importance.high,);constnotificationDetailsNotificationDetails(android:androidDetails,ohos:ohosDetails,);await_notifications.show(_notificationId,_titleController.text,_bodyController.text,notificationDetails,payload:notification_payload,);}Futurevoid_scheduleNotification()async{finaldelayint.tryParse(_delayController.text)??5;finalscheduledTimetz.TZDateTime.now(tz.local).add(Duration(seconds:delay));constandroidDetailsAndroidNotificationDetails(scheduled_channel_id,定时通知,channelDescription:这是定时通知通道,importance:Importance.high,priority:Priority.high,);constohosDetailsOHOSNotificationDetails(importance:Importance.high,);constnotificationDetailsNotificationDetails(android:androidDetails,ohos:ohosDetails,);await_notifications.zonedSchedule(_notificationId,_titleController.text,_bodyController.text,scheduledTime,notificationDetails,androidScheduleMode:AndroidScheduleMode.exactAllowWhileIdle,payload:scheduled_notification_payload,);}Futurevoid_cancelAllNotifications()async{await_notifications.cancelAll();}overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText(LocalNotifications OH 示例),backgroundColor:Theme.of(context).colorScheme.inversePrimary,),body:SingleChildScrollView(padding:constEdgeInsets.all(16.0),child:Column(crossAxisAlignment:CrossAxisAlignment.stretch,children:[_buildNotificationTypeSelector(),constSizedBox(height:20),_buildNotificationContent(),constSizedBox(height:20),_buildNotificationActions(),],),),);}}五、OpenHarmony 平台特殊适配处理5.1 权限配置在 OpenHarmony 平台上使用本地通知需要配置通知权限。在ohos/entry/src/main/module.json5中添加必要的权限声明{module:{name:entry,type:entry,description:$string:module_desc,mainElement:EntryAbility,deviceTypes:[phone,tablet],abilities:[{name:EntryAbility,srcEntrance:./ets/entryability/EntryAbility.ets,description:$string:entry_ability_desc,icon:$media:app_icon,label:$string:entry_ability_label,type:page,launchType:standard}]}}5.2 通知通道在 OpenHarmony 平台上flutter_local_notifications 会自动创建通知通道。不同的通知类型可以使用不同的通道default_channel_id默认通知通道sound_channel_id带声音的通知通道scheduled_channel_id定时通知通道bigtext_channel_id大文本通知通道5.3 通知优先级flutter_local_notifications 支持设置通知的优先级Priority.max最高优先级Priority.high高优先级Priority.default默认优先级Priority.low低优先级Priority.min最低优先级六、常见问题与解决方案6.1 问题通知不显示原因分析通知权限未授权应用在后台被清理通知通道配置错误解决方案检查并请求通知权限确保应用未被系统清理验证通知通道 IDFuturevoid_requestPermissions()async{await_notifications.resolvePlatformSpecificImplementationAndroidFlutterLocalNotificationsPlugin()?.requestNotificationsPermission();}6.2 问题定时通知不触发原因分析时区配置问题应用被清理定时器配置错误解决方案确保正确初始化时区使用 exactAllowWhileIdle 模式检查定时器配置await_notifications.zonedSchedule(0,定时通知,内容,scheduledTime,notificationDetails,androidScheduleMode:AndroidScheduleMode.exactAllowWhileIdle,);6.3 问题通知声音不响原因分析系统静音模式声音文件不存在权限配置问题解决方案检查系统声音设置确保声音文件有效配置正确的通知设置七、运行验证7.1 构建命令flutter build ohos flutter run-ddevice_id7.2 功能测试清单确保测试以下功能点即时通知发送带声音通知发送定时通知发送大文本通知发送单条通知取消所有通知取消通知点击响应权限请求八、总结与扩展通过本文的实践我们成功完成了 flutter_local_notifications 库在 Flutter-OH 项目中的集成与适配。flutter_local_notifications 作为一个成熟的 Flutter 插件在 OpenHarmony 平台上的适配相对平滑开发者主要需要关注的是权限配置和通知通道管理。8.1 核心要点回顾环境配置确保 Flutter 和 OpenHarmony SDK 版本兼容依赖管理在 pubspec.yaml 中正确添加 flutter_local_notifications 和 timezone 依赖API 使用遵循库的设计规范合理使用各种通知方法平台适配关注 OpenHarmony 特有的权限配置和通知通道权限处理做好权限请求和错误处理8.2 进阶扩展方向对于更复杂的通知需求可以考虑以下方案周期性通知使用 periodic 来实现重复通知带操作按钮的通知添加通知操作按钮进度通知显示下载或处理进度通知分类根据通知类型进行分类管理flutter_local_notifications 虽然简单但却是 Flutter 应用开发中不可或缺的工具。结合 OpenHarmony 平台的特性合理使用可以为用户提供及时、准确的通知提醒提升用户体验。希望本文能为正在进行鸿蒙化适配的开发者提供有价值的参考。本文仓库地址https://atomgit.com/your_username/flutter_local_notifications_oh参考文献flutter_local_notifications 官方文档https://pub.dev/packages/flutter_local_notificationstimezone 官方文档https://pub.dev/packages/timezoneOpenHarmony 官方文档https://gitee.com/openharmony/docsFlutter for OpenHarmony 文档https://gitee.com/openharmony-sig/flutter