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 get _instance async => _prefs ??= await SharedPreferences.getInstance(); /// 外部预初始化(在 [main] 中 await,使同步读取可用)。 Future 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 saveTheme(String orgId, String themeId) async { final prefs = await _instance; await prefs.setString(_themeKey(orgId), themeId); } /// 读取门店主题 id;未设置返回 null。 Future getTheme(String orgId) async { final prefs = await _instance; return prefs.getString(_themeKey(orgId)); } /// 保存门店品牌(启动图 + Logo 本地路径或远程 URL)。 Future saveBranding( String orgId, String splashUrl, String logoUrl, ) async { final prefs = await _instance; await prefs.setStringList( _brandingKey(orgId), [splashUrl, logoUrl], ); } /// 读取门店品牌;返回 `[splashUrl, logoUrl]`,未设置时元素为空字符串。 Future> 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 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> 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 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> 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 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); } }