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; }