fix: 修复notification_init_stub鸿蒙端兼容性 - dynamic调用隔离ohos参数
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
/// 创建时间: 2026-05-22
|
/// 创建时间: 2026-05-22
|
||||||
/// 更新时间: 2026-06-01
|
/// 更新时间: 2026-06-01
|
||||||
/// 作用: 构建含OHOS参数的InitializationSettings
|
/// 作用: 构建含OHOS参数的InitializationSettings
|
||||||
/// 上次更新: 兼容官方SDK(无OhosInitializationSettings),MacBook Pro端不传ohos参数
|
/// 上次更新: 兼容官方SDK和鸿蒙本地包,使用dynamic调用隔离ohos参数
|
||||||
/// ============================================================
|
/// ============================================================
|
||||||
|
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
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 参数。
|
/// 鸿蒙端本地包的 InitializationSettings 构造函数支持 ohos 参数。
|
||||||
///
|
///
|
||||||
/// MacBook Pro 端:不传 ohos 参数,标准构造
|
/// MacBook Pro 端:不传 ohos 参数,标准构造
|
||||||
/// OHOS端:本地包包含 ohos 参数和 OhosInitializationSettings,
|
/// OHOS端:通过 dynamic 调用传入 ohos 参数,绕过官方 SDK 静态检查
|
||||||
/// 通过 ohos_init_bridge.dart 中调用,此处仅提供非鸿蒙端逻辑
|
|
||||||
InitializationSettings buildNotificationInitSettings({
|
InitializationSettings buildNotificationInitSettings({
|
||||||
required AndroidInitializationSettings androidSettings,
|
required AndroidInitializationSettings androidSettings,
|
||||||
required DarwinInitializationSettings iosSettings,
|
required DarwinInitializationSettings iosSettings,
|
||||||
DarwinInitializationSettings? macOsSettings,
|
DarwinInitializationSettings? macOsSettings,
|
||||||
String ohosDefaultIcon = '@mipmap/ic_launcher',
|
String ohosDefaultIcon = '@mipmap/ic_launcher',
|
||||||
}) {
|
}) {
|
||||||
|
if (pu.isOhos) {
|
||||||
|
return _buildOhosInitSettings(
|
||||||
|
androidSettings: androidSettings,
|
||||||
|
iosSettings: iosSettings,
|
||||||
|
macOsSettings: macOsSettings,
|
||||||
|
ohosDefaultIcon: ohosDefaultIcon,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return InitializationSettings(
|
return InitializationSettings(
|
||||||
android: androidSettings,
|
android: androidSettings,
|
||||||
iOS: iosSettings,
|
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(不执行)
|
/// MacBook Pro 端始终返回 false(不执行)
|
||||||
/// OHOS端通过 ohos_init_bridge.dart 中的实现调用
|
/// OHOS端通过 OhosFlutterLocalNotificationsPlugin 请求权限
|
||||||
Future<bool> requestOhosNotificationPermission(
|
Future<bool> requestOhosNotificationPermission(
|
||||||
FlutterLocalNotificationsPlugin plugin,
|
FlutterLocalNotificationsPlugin plugin,
|
||||||
) async {
|
) async {
|
||||||
if (!pu.isOhos) return false;
|
if (!pu.isOhos) return false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final dynamic dynamicPlugin = plugin;
|
final dynamic ohosPlugin =
|
||||||
final List<dynamic> implementations = dynamicPlugin
|
plugin.resolvePlatformSpecificImplementation();
|
||||||
._platformSpecifics as List<dynamic>;
|
if (ohosPlugin == null) return false;
|
||||||
for (final impl in implementations) {
|
final dynamic result =
|
||||||
final dynamic result =
|
await ohosPlugin.requestNotificationsPermission();
|
||||||
await impl.requestNotificationsPermission();
|
return result == true;
|
||||||
if (result == true) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user