Files
social-app/docs/bugs/sharedpreferences缺少统一管理模型.md
T

2.3 KiB

SharedPreferences 缺少统一管理模型

问题描述

当前 SharedPreferences 的使用散落各处,缺乏统一的数据模型约束:

现状

  1. Key 散落

    • reminder_notification_callbacks.dart 中定义:'calendar_reminder_pending_notification_responses_v1'
    • 各处直接使用字符串 key,容易拼写错误或冲突
  2. 重复获取实例

    final prefs = await SharedPreferences.getInstance();  // 每次都重新获取
    
  3. 序列化逻辑分散

    • ReminderNotificationCallbacks 自己处理 JSON 序列化/反序列化
    • 其他模块可能重复相同逻辑
  4. 注册但未统一封装

    • 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 - 另一使用方

状态

  • 待修复