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

140 lines
4.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}