Files
CloudHome-Ops/lib/utils/store_local_cache.dart

140 lines
4.4 KiB
Dart
Raw Permalink Normal View History

import 'package:shared_preferences/shared_preferences.dart';
/// 门店扩展字段本地持久化(SharedPreferences 封装)。
///
/// 用于「前端先占位」阶段:主题、品牌(启动图/Logo)、省市区归属等
/// 全部只写本地缓存,不发起真实请求。key 以 `orgId` 隔离,切换组织后互不影响。
///
/// TODO(后端): 上述字段后续由 [OrgService.setStoreTheme] /
/// [OrgService.setStoreBranding] 对接 POST /sys/store/* 覆盖,本地缓存可作为离线兜底。
class StoreLocalCache {
StoreLocalCache._();
/// 全局单例。
static final StoreLocalCache instance = StoreLocalCache._();
SharedPreferences? _prefs;
/// 懒初始化 SharedPreferences(仅在首次访问时调用)。
Future<SharedPreferences> get _instance async =>
_prefs ??= await SharedPreferences.getInstance();
/// 外部预初始化(在 [main] 中 await,使同步读取可用)。
Future<void> initialize() async {
_prefs ??= await SharedPreferences.getInstance();
}
/// 主题 key:`store_theme_$orgId`。
String _themeKey(String orgId) => 'store_theme_$orgId';
/// 品牌 key:`store_branding_$orgId`。
String _brandingKey(String orgId) => 'store_branding_$orgId';
/// 省市区归属 key:`store_region_$orgId`。
String _regionKey(String orgId) => 'store_region_$orgId';
/// 设备绑定关系 key:`device_binding_$deviceId`。
String _bindingKey(String deviceId) => 'device_binding_$deviceId';
/// 保存门店主题。
Future<void> saveTheme(String orgId, String themeId) async {
final prefs = await _instance;
await prefs.setString(_themeKey(orgId), themeId);
}
/// 读取门店主题 id;未设置返回 null。
Future<String?> getTheme(String orgId) async {
final prefs = await _instance;
return prefs.getString(_themeKey(orgId));
}
/// 保存门店品牌(启动图 + Logo 本地路径或远程 URL)。
Future<void> saveBranding(
String orgId,
String splashUrl,
String logoUrl,
) async {
final prefs = await _instance;
await prefs.setStringList(
_brandingKey(orgId),
[splashUrl, logoUrl],
);
}
/// 读取门店品牌;返回 `[splashUrl, logoUrl]`,未设置时元素为空字符串。
Future<List<String>> getBranding(String orgId) async {
final prefs = await _instance;
final raw = prefs.getStringList(_brandingKey(orgId));
if (raw == null || raw.length < 2) {
return const ['', ''];
}
return raw;
}
/// 保存门店省市区归属与街道详情。
Future<void> saveRegion(
String orgId,
String provinceCode,
String cityCode,
String districtCode,
String addressDetail,
) async {
final prefs = await _instance;
await prefs.setStringList(
_regionKey(orgId),
[provinceCode, cityCode, districtCode, addressDetail],
);
}
/// 读取门店省市区归属;返回 `[provinceCode, cityCode, districtCode, addressDetail]`
/// 未设置时元素为空字符串。
Future<List<String>> getRegion(String orgId) async {
final prefs = await _instance;
final raw = prefs.getStringList(_regionKey(orgId));
if (raw == null || raw.length < 4) {
return const ['', '', '', ''];
}
return raw;
}
/// 保存设备绑定关系(扫码绑定占位)。
Future<void> saveDeviceBinding(
String deviceId,
String storeId,
String storeName,
String? groupId,
) async {
final prefs = await _instance;
await prefs.setStringList(
_bindingKey(deviceId),
[storeId, storeName, groupId ?? ''],
);
}
/// 读取设备绑定关系;返回 `[storeId, storeName, groupId]`,
/// 未设置时元素为空字符串。
Future<List<String>> getDeviceBinding(String deviceId) async {
final prefs = await _instance;
final raw = prefs.getStringList(_bindingKey(deviceId));
if (raw == null || raw.length < 3) {
return const ['', '', ''];
}
return raw;
}
// ================ 通用 String 存取(用于语言、主题等非门店隔离配置) ================
/// 保存字符串。
Future<void> setString(String key, String value) async {
final prefs = await _instance;
await prefs.setString(key, value);
}
/// 读取字符串;不存在返回 null。
String? getString(String key) {
final prefs = _prefs;
if (prefs == null) return null;
return prefs.getString(key);
}
}