fix: 修复notification_init_stub鸿蒙端兼容性 - dynamic调用隔离ohos参数
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user