From be5f5e90ec4fff4192d8f37d169622b430dca8dd Mon Sep 17 00:00:00 2001 From: Developer Date: Mon, 1 Jun 2026 08:43:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dnotification=5Finit=5F?= =?UTF-8?q?stub=E9=B8=BF=E8=92=99=E7=AB=AF=E5=85=BC=E5=AE=B9=E6=80=A7=20-?= =?UTF-8?q?=20dynamic=E8=B0=83=E7=94=A8=E9=9A=94=E7=A6=BBohos=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/notification_init_stub.dart | 73 +++++++++++++++---- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/lib/core/services/notification/notification_init_stub.dart b/lib/core/services/notification/notification_init_stub.dart index a5c1cf9f..8f4f5bc2 100644 --- a/lib/core/services/notification/notification_init_stub.dart +++ b/lib/core/services/notification/notification_init_stub.dart @@ -3,7 +3,7 @@ /// 创建时间: 2026-05-22 /// 更新时间: 2026-06-01 /// 作用: 构建含OHOS参数的InitializationSettings -/// 上次更新: 兼容官方SDK(无OhosInitializationSettings),MacBook Pro端不传ohos参数 +/// 上次更新: 兼容官方SDK和鸿蒙本地包,使用dynamic调用隔离ohos参数 /// ============================================================ import 'package:flutter_local_notifications/flutter_local_notifications.dart'; @@ -15,14 +15,22 @@ import 'package:xianyan/core/utils/platform/platform_utils.dart' as pu; /// 鸿蒙端本地包的 InitializationSettings 构造函数支持 ohos 参数。 /// /// MacBook Pro 端:不传 ohos 参数,标准构造 -/// OHOS端:本地包包含 ohos 参数和 OhosInitializationSettings, -/// 通过 ohos_init_bridge.dart 中调用,此处仅提供非鸿蒙端逻辑 +/// OHOS端:通过 dynamic 调用传入 ohos 参数,绕过官方 SDK 静态检查 InitializationSettings buildNotificationInitSettings({ required AndroidInitializationSettings androidSettings, required DarwinInitializationSettings iosSettings, DarwinInitializationSettings? macOsSettings, String ohosDefaultIcon = '@mipmap/ic_launcher', }) { + if (pu.isOhos) { + return _buildOhosInitSettings( + androidSettings: androidSettings, + iosSettings: iosSettings, + macOsSettings: macOsSettings, + ohosDefaultIcon: ohosDefaultIcon, + ); + } + return InitializationSettings( android: androidSettings, iOS: iosSettings, @@ -30,25 +38,64 @@ InitializationSettings buildNotificationInitSettings({ ); } +/// 鸿蒙端构建含 ohos 参数的 InitializationSettings +/// +/// 使用 dynamic 调用绕过官方 SDK 的静态类型检查: +/// - 鸿蒙端本地包的 InitializationSettings 构造函数接受 ohos 命名参数 +/// - 官方 SDK 的 InitializationSettings 不接受 ohos 参数 +/// - 通过 dynamic 调用,鸿蒙端可传入 ohos 参数,MacBook Pro 端不会执行此代码 +InitializationSettings _buildOhosInitSettings({ + required AndroidInitializationSettings androidSettings, + required DarwinInitializationSettings iosSettings, + DarwinInitializationSettings? macOsSettings, + String ohosDefaultIcon = '@mipmap/ic_launcher', +}) { + try { + final dynamic ohosSettings = _createOhosInitializationSettings( + ohosDefaultIcon, + ); + final dynamic constructor = InitializationSettings.new; + return constructor( + android: androidSettings, + iOS: iosSettings, + macOS: macOsSettings, + ohos: ohosSettings, + ) as InitializationSettings; + } catch (_) { + return InitializationSettings( + android: androidSettings, + iOS: iosSettings, + macOS: macOsSettings, + ); + } +} + +/// 动态创建 OhosInitializationSettings(鸿蒙端本地包专用) +/// +/// 鸿蒙端本地包导出 OhosInitializationSettings 类, +/// 官方 SDK 不存在此类。通过 dynamic 反射创建实例。 +dynamic _createOhosInitializationSettings(String defaultIcon) { + final dynamic plugin = FlutterLocalNotificationsPlugin; + final dynamic ohosClass = plugin.ohosInitializationSettings; + return ohosClass(defaultIcon); +} + /// 请求鸿蒙端通知权限 /// /// MacBook Pro 端始终返回 false(不执行) -/// OHOS端通过 ohos_init_bridge.dart 中的实现调用 +/// OHOS端通过 OhosFlutterLocalNotificationsPlugin 请求权限 Future requestOhosNotificationPermission( FlutterLocalNotificationsPlugin plugin, ) async { if (!pu.isOhos) return false; try { - final dynamic dynamicPlugin = plugin; - final List implementations = dynamicPlugin - ._platformSpecifics as List; - for (final impl in implementations) { - final dynamic result = - await impl.requestNotificationsPermission(); - if (result == true) return true; - } - return false; + final dynamic ohosPlugin = + plugin.resolvePlatformSpecificImplementation(); + if (ohosPlugin == null) return false; + final dynamic result = + await ohosPlugin.requestNotificationsPermission(); + return result == true; } catch (e) { return false; }