2.3 KiB
2.3 KiB
SharedPreferences 缺少统一管理模型
问题描述
当前 SharedPreferences 的使用散落各处,缺乏统一的数据模型约束:
现状
-
Key 散落
reminder_notification_callbacks.dart中定义:'calendar_reminder_pending_notification_responses_v1'- 各处直接使用字符串 key,容易拼写错误或冲突
-
重复获取实例
final prefs = await SharedPreferences.getInstance(); // 每次都重新获取 -
序列化逻辑分散
ReminderNotificationCallbacks自己处理 JSON 序列化/反序列化- 其他模块可能重复相同逻辑
-
注册但未统一封装
injection.dart只注册了SharedPreferences实例- 没有封装成可复用的数据访问层
影响
- 维护困难:Key 散落,修改时需要全局搜索
- 容易出错:拼写错误难以发现
- 代码重复:序列化逻辑可能在多处重复实现
- 可测试性差:直接依赖
SharedPreferences.getInstance()
建议方案
1. 创建 AppPreferences 数据模型
class AppPreferences {
static const String _pendingNotificationsKey =
'calendar_reminder_pending_notification_responses_v1';
final SharedPreferences _prefs;
AppPreferences(this._prefs);
List<NotificationResponse> get pendingNotifications {
final list = _prefs.getStringList(_pendingNotificationsKey) ?? [];
return list.map(_decode).toList();
}
Future<void> setPendingNotifications(List<NotificationResponse> value) {
return _prefs.setStringList(_pendingNotificationsKey, value.map(_encode).toList());
}
// 其他偏好设置...
}
2. 在 injection.dart 中注册
final sharedPreferences = await SharedPreferences.getInstance();
sl.registerSingleton<AppPreferences>(AppPreferences(sharedPreferences));
3. 使用方通过接口访问
// 之前
final prefs = await SharedPreferences.getInstance();
await prefs.setStringList(key, value);
// 之后
sl<AppPreferences>().setPendingNotifications(value);
涉及文件
apps/lib/app/di/injection.dart- 注册逻辑apps/lib/features/notification/data/services/reminder_notification_callbacks.dart- 主要使用方apps/lib/features/notification/data/services/ios_notification_payload_bridge.dart- 另一使用方
状态
- 待修复