fix: 修复notification_init_stub鸿蒙端兼容性 - dynamic调用隔离ohos参数

This commit is contained in:
Developer
2026-06-01 08:43:23 +08:00
parent d2bbd5aeb8
commit be5f5e90ec

View File

@@ -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<bool> requestOhosNotificationPermission(
FlutterLocalNotificationsPlugin plugin,
) async {
if (!pu.isOhos) return false;
try {
final dynamic dynamicPlugin = plugin;
final List<dynamic> implementations = dynamicPlugin
._platformSpecifics as List<dynamic>;
for (final impl in implementations) {
final dynamic ohosPlugin =
plugin.resolvePlatformSpecificImplementation();
if (ohosPlugin == null) return false;
final dynamic result =
await impl.requestNotificationsPermission();
if (result == true) return true;
}
return false;
await ohosPlugin.requestNotificationsPermission();
return result == true;
} catch (e) {
return false;
}