refactor: 重构项目目录结构与路径引用

1.  调整工具类、平台相关代码的目录组织,将原有根目录下的工具类迁移到`data/`和`platform/`子目录
2.  统一修复全项目的文件导入路径,匹配新的目录结构
3.  新增Web端平台适配的Stub实现,包括Isolate、path_provider、platform_io等
4.  删除旧的单文件平台适配实现,替换为分平台的目录结构实现
5.  移除旧的iOS Widget入口文件,新增Widget Extension的权限配置
6.  调整部分组件的目录位置,统一widget的分类组织
7.  修复部分硬编码文本和废弃的正则表达式逻辑
This commit is contained in:
Developer
2026-05-23 05:16:31 +08:00
parent 85d856f0ed
commit a9499d7219
357 changed files with 6505 additions and 2532 deletions

View File

@@ -18,7 +18,7 @@ import '../../router/app_router.dart';
import 'notification_center.dart';
import '../../storage/app_kv_store.dart';
import '../../utils/logger.dart';
import '../../utils/platform_utils.dart' as pu;
import '../../utils/platform/platform_utils.dart' as pu;
import 'notification_init_stub.dart';
class LocalNotificationService {
@@ -59,20 +59,23 @@ class LocalNotificationService {
requestSoundPermission: false,
);
// 通过桥接方法构建 InitializationSettings
// 官方SDK不含ohos参数鸿蒙端动态注入ohos参数
final settings = buildNotificationInitSettings(
androidSettings: androidSettings,
iosSettings: iosSettings,
);
await _plugin.initialize(
settings: settings,
onDidReceiveNotificationResponse: _onNotificationTapped,
);
_initialized = true;
Log.i('本地通知服务初始化完成 (权限延迟到用户开启通知时申请)');
try {
await _plugin
.initialize(
settings: settings,
onDidReceiveNotificationResponse: _onNotificationTapped,
)
.timeout(const Duration(seconds: 5));
_initialized = true;
Log.i('本地通知服务初始化完成 (权限延迟到用户开启通知时申请)');
} catch (e, st) {
Log.e('本地通知服务初始化失败', e, st);
}
}
static Future<bool> requestPermission() async {

View File

@@ -3,7 +3,7 @@
/// 创建时间: 2026-05-22
/// 更新时间: 2026-05-22
/// 作用: 合并 NotificationScheduler + DailyNotifyService统一管理所有本地通知调度
/// 上次更新: 初始版本,合并每日推荐/签到/节气/运势/学习进度/稍后读通知
/// 上次更新: 修复Readlater开关未触发configureAll的问题
/// ============================================================
import 'local_notification_service.dart';
@@ -138,6 +138,7 @@ class NotificationCenter {
static Future<void> setReadlaterEnabled(bool v) async {
await AppKVStore.setBool(_keyReadlaterEnabled, v);
await configureAll();
}
// ── 核心调度 ──
@@ -275,29 +276,197 @@ class NotificationCenter {
}
static final List<Map<String, dynamic>> _solarTerms2026 = [
{'year': 2026, 'month': 1, 'day': 5, 'name': '小寒', 'emoji': '❄️', 'poem': '小寒连大吕,欢鹊垒新巢'},
{'year': 2026, 'month': 1, 'day': 20, 'name': '大寒', 'emoji': '🧊', 'poem': '大寒须守火,无事不出门'},
{'year': 2026, 'month': 2, 'day': 4, 'name': '立春', 'emoji': '🌱', 'poem': '春风如贵客,一到便繁华'},
{'year': 2026, 'month': 2, 'day': 18, 'name': '雨水', 'emoji': '🌧️', 'poem': '好雨知时节,当春乃发生'},
{'year': 2026, 'month': 3, 'day': 5, 'name': '惊蛰', 'emoji': '', 'poem': '微雨众卉新,一雷惊蛰始'},
{'year': 2026, 'month': 3, 'day': 20, 'name': '春分', 'emoji': '🌸', 'poem': '雪入春分省见稀,半开桃李不胜威'},
{'year': 2026, 'month': 4, 'day': 5, 'name': '清明', 'emoji': '🍃', 'poem': '清明时节雨纷纷,路上行人欲断魂'},
{'year': 2026, 'month': 4, 'day': 20, 'name': '谷雨', 'emoji': '🌾', 'poem': '谷雨如丝复似尘,煮瓶浮蜡正尝新'},
{'year': 2026, 'month': 5, 'day': 5, 'name': '立夏', 'emoji': '☀️', 'poem': '绿树阴浓夏日长,楼台倒影入池塘'},
{'year': 2026, 'month': 5, 'day': 21, 'name': '小满', 'emoji': '🌿', 'poem': '夜莺啼绿柳,皓月醒长空'},
{'year': 2026, 'month': 6, 'day': 5, 'name': '芒种', 'emoji': '🌻', 'poem': '时雨及芒种,四野皆插秧'},
{'year': 2026, 'month': 6, 'day': 21, 'name': '夏至', 'emoji': '🌞', 'poem': '昼晷已云极,宵漏自此长'},
{'year': 2026, 'month': 7, 'day': 7, 'name': '小暑', 'emoji': '🌡️', 'poem': '倏忽温风至,因循小暑来'},
{'year': 2026, 'month': 7, 'day': 22, 'name': '大暑', 'emoji': '🔥', 'poem': '大暑三秋近,林钟九夏移'},
{'year': 2026, 'month': 8, 'day': 7, 'name': '立秋', 'emoji': '🍂', 'poem': '乳鸦啼散玉屏空,一枕新凉一扇风'},
{'year': 2026, 'month': 8, 'day': 23, 'name': '处暑', 'emoji': '🎐', 'poem': '处暑无三日,新凉直万金'},
{'year': 2026, 'month': 9, 'day': 7, 'name': '白露', 'emoji': '💎', 'poem': '露从今夜白,月是故乡明'},
{'year': 2026, 'month': 9, 'day': 23, 'name': '秋分', 'emoji': '🍁', 'poem': '金气秋分,风清露冷秋期半'},
{'year': 2026, 'month': 10, 'day': 8, 'name': '寒露', 'emoji': '💧', 'poem': '袅袅凉风动,凄凄寒露零'},
{'year': 2026, 'month': 10, 'day': 23, 'name': '霜降', 'emoji': '🧊', 'poem': '霜降碧天静,秋事促西风'},
{'year': 2026, 'month': 11, 'day': 7, 'name': '立冬', 'emoji': '🧣', 'poem': '冻笔新诗懒写,寒炉美酒时温'},
{'year': 2026, 'month': 11, 'day': 22, 'name': '小雪', 'emoji': '🌨️', 'poem': '片片互玲珑,飞扬玉漏终'},
{'year': 2026, 'month': 12, 'day': 7, 'name': '大雪', 'emoji': '❄️', 'poem': '大雪江南见未曾,今年方始是严凝'},
{'year': 2026, 'month': 12, 'day': 21, 'name': '冬至', 'emoji': '🥟', 'poem': '天时人事日相催,冬至阳生春又来'},
{
'year': 2026,
'month': 1,
'day': 5,
'name': '小寒',
'emoji': '❄️',
'poem': '小寒连大吕,欢鹊垒新巢',
},
{
'year': 2026,
'month': 1,
'day': 20,
'name': '大寒',
'emoji': '🧊',
'poem': '大寒须守火,无事不出门',
},
{
'year': 2026,
'month': 2,
'day': 4,
'name': '立春',
'emoji': '🌱',
'poem': '春风如贵客,一到便繁华',
},
{
'year': 2026,
'month': 2,
'day': 18,
'name': '雨水',
'emoji': '🌧️',
'poem': '好雨知时节,当春乃发生',
},
{
'year': 2026,
'month': 3,
'day': 5,
'name': '惊蛰',
'emoji': '',
'poem': '微雨众卉新,一雷惊蛰始',
},
{
'year': 2026,
'month': 3,
'day': 20,
'name': '春分',
'emoji': '🌸',
'poem': '雪入春分省见稀,半开桃李不胜威',
},
{
'year': 2026,
'month': 4,
'day': 5,
'name': '清明',
'emoji': '🍃',
'poem': '清明时节雨纷纷,路上行人欲断魂',
},
{
'year': 2026,
'month': 4,
'day': 20,
'name': '谷雨',
'emoji': '🌾',
'poem': '谷雨如丝复似尘,煮瓶浮蜡正尝新',
},
{
'year': 2026,
'month': 5,
'day': 5,
'name': '立夏',
'emoji': '☀️',
'poem': '绿树阴浓夏日长,楼台倒影入池塘',
},
{
'year': 2026,
'month': 5,
'day': 21,
'name': '小满',
'emoji': '🌿',
'poem': '夜莺啼绿柳,皓月醒长空',
},
{
'year': 2026,
'month': 6,
'day': 5,
'name': '芒种',
'emoji': '🌻',
'poem': '时雨及芒种,四野皆插秧',
},
{
'year': 2026,
'month': 6,
'day': 21,
'name': '夏至',
'emoji': '🌞',
'poem': '昼晷已云极,宵漏自此长',
},
{
'year': 2026,
'month': 7,
'day': 7,
'name': '小暑',
'emoji': '🌡️',
'poem': '倏忽温风至,因循小暑来',
},
{
'year': 2026,
'month': 7,
'day': 22,
'name': '大暑',
'emoji': '🔥',
'poem': '大暑三秋近,林钟九夏移',
},
{
'year': 2026,
'month': 8,
'day': 7,
'name': '立秋',
'emoji': '🍂',
'poem': '乳鸦啼散玉屏空,一枕新凉一扇风',
},
{
'year': 2026,
'month': 8,
'day': 23,
'name': '处暑',
'emoji': '🎐',
'poem': '处暑无三日,新凉直万金',
},
{
'year': 2026,
'month': 9,
'day': 7,
'name': '白露',
'emoji': '💎',
'poem': '露从今夜白,月是故乡明',
},
{
'year': 2026,
'month': 9,
'day': 23,
'name': '秋分',
'emoji': '🍁',
'poem': '金气秋分,风清露冷秋期半',
},
{
'year': 2026,
'month': 10,
'day': 8,
'name': '寒露',
'emoji': '💧',
'poem': '袅袅凉风动,凄凄寒露零',
},
{
'year': 2026,
'month': 10,
'day': 23,
'name': '霜降',
'emoji': '🧊',
'poem': '霜降碧天静,秋事促西风',
},
{
'year': 2026,
'month': 11,
'day': 7,
'name': '立冬',
'emoji': '🧣',
'poem': '冻笔新诗懒写,寒炉美酒时温',
},
{
'year': 2026,
'month': 11,
'day': 22,
'name': '小雪',
'emoji': '🌨️',
'poem': '片片互玲珑,飞扬玉漏终',
},
{
'year': 2026,
'month': 12,
'day': 7,
'name': '大雪',
'emoji': '❄️',
'poem': '大雪江南见未曾,今年方始是严凝',
},
{
'year': 2026,
'month': 12,
'day': 21,
'name': '冬至',
'emoji': '🥟',
'poem': '天时人事日相催,冬至阳生春又来',
},
];
}

View File

@@ -1,4 +1,4 @@
/// ============================================================
/// ============================================================
/// 闲言APP — 通知初始化桥接
/// 创建时间: 2026-05-22
/// 更新时间: 2026-05-22
@@ -7,7 +7,7 @@
/// ============================================================
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:xianyan/core/utils/platform_utils.dart' as pu;
import 'package:xianyan/core/utils/platform/platform_utils.dart' as pu;
/// 构建通知初始化设置
///
@@ -48,6 +48,7 @@ InitializationSettings buildNotificationInitSettings({
ohosDefaultIcon,
);
if (ohosSettings != null) {
// ignore: avoid_dynamic_calls
settings.ohos = ohosSettings;
}
} catch (_) {
@@ -90,6 +91,7 @@ Future<bool> requestOhosNotificationPermission(
final dynamic ohosPlugin =
plugin.resolvePlatformSpecificImplementation();
final dynamic result =
// ignore: avoid_dynamic_calls
await ohosPlugin?.requestNotificationsPermission();
return result as bool? ?? false;
} catch (e) {

View File

@@ -1,4 +1,4 @@
/// ============================================================
/// ============================================================
/// 闲言APP — 本地通知服务
/// 创建时间: 2026-05-10
/// 更新时间: 2026-05-17
@@ -13,7 +13,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import 'package:xianyan/core/utils/platform_utils.dart' as pu;
import 'package:xianyan/core/utils/platform/platform_utils.dart' as pu;
import '../../utils/logger.dart';
import 'notification_init_stub.dart';