local_storage.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:shared_preferences/shared_preferences.dart';
  4. import 'package:sino_med_cloud/core/constants/app_constants.dart';
  5. /// 本地存储管理类
  6. class LocalStorage {
  7. static SharedPreferences? _prefs;
  8. static Completer<void>? _initCompleter;
  9. /// 初始化本地存储
  10. static Future<void> init() async {
  11. if (_prefs != null) {
  12. return;
  13. }
  14. _prefs = await SharedPreferences.getInstance();
  15. _initCompleter?.complete();
  16. _initCompleter = null;
  17. }
  18. /// 确保已初始化(自动初始化,如果未初始化则初始化)
  19. static Future<void> _ensureInitialized() async {
  20. if (_prefs != null) {
  21. return;
  22. }
  23. // 如果正在初始化,等待初始化完成
  24. if (_initCompleter != null) {
  25. await _initCompleter!.future;
  26. return;
  27. }
  28. // 开始初始化
  29. _initCompleter = Completer<void>();
  30. await init();
  31. }
  32. /// 获取 SharedPreferences 实例(内部使用)
  33. static Future<SharedPreferences> get _prefsAsync async {
  34. await _ensureInitialized();
  35. return _prefs!;
  36. }
  37. // ==================== String 操作 ====================
  38. /// 保存字符串
  39. static Future<bool> setString(String key, String value) async {
  40. final prefs = await _prefsAsync;
  41. return await prefs.setString(key, value);
  42. }
  43. /// 获取字符串
  44. static Future<String?> getString(String key, {String? defaultValue}) async {
  45. final prefs = await _prefsAsync;
  46. return prefs.getString(key) ?? defaultValue;
  47. }
  48. // ==================== Int 操作 ====================
  49. /// 保存整数
  50. static Future<bool> setInt(String key, int value) async {
  51. final prefs = await _prefsAsync;
  52. return await prefs.setInt(key, value);
  53. }
  54. /// 获取整数
  55. static Future<int?> getInt(String key, {int? defaultValue}) async {
  56. final prefs = await _prefsAsync;
  57. return prefs.getInt(key) ?? defaultValue;
  58. }
  59. // ==================== Double 操作 ====================
  60. /// 保存浮点数
  61. static Future<bool> setDouble(String key, double value) async {
  62. final prefs = await _prefsAsync;
  63. return await prefs.setDouble(key, value);
  64. }
  65. /// 获取浮点数
  66. static Future<double?> getDouble(String key, {double? defaultValue}) async {
  67. final prefs = await _prefsAsync;
  68. return prefs.getDouble(key) ?? defaultValue;
  69. }
  70. // ==================== Bool 操作 ====================
  71. /// 保存布尔值
  72. static Future<bool> setBool(String key, bool value) async {
  73. final prefs = await _prefsAsync;
  74. return await prefs.setBool(key, value);
  75. }
  76. /// 获取布尔值
  77. static Future<bool?> getBool(String key, {bool? defaultValue}) async {
  78. final prefs = await _prefsAsync;
  79. return prefs.getBool(key) ?? defaultValue;
  80. }
  81. // ==================== StringList 操作 ====================
  82. /// 保存字符串列表
  83. static Future<bool> setStringList(String key, List<String> value) async {
  84. final prefs = await _prefsAsync;
  85. return await prefs.setStringList(key, value);
  86. }
  87. /// 获取字符串列表
  88. static Future<List<String>?> getStringList(String key) async {
  89. final prefs = await _prefsAsync;
  90. return prefs.getStringList(key);
  91. }
  92. // ==================== Map 操作 ====================
  93. /// 保存键值对(Map)
  94. ///
  95. /// [key] 存储的键
  96. /// [value] 要保存的 Map 对象
  97. ///
  98. /// 返回保存是否成功
  99. ///
  100. /// 示例:
  101. /// ```dart
  102. /// await LocalStorage.setMap('user', {'name': 'John', 'age': 30});
  103. /// ```
  104. static Future<bool> setMap(String key, Map<String, dynamic> value) async {
  105. try {
  106. // 将 Map 转换为 JSON 字符串保存
  107. final jsonString = jsonEncode(value);
  108. final prefs = await _prefsAsync;
  109. return await prefs.setString(key, jsonString);
  110. } catch (e) {
  111. // 如果转换失败,返回 false
  112. return false;
  113. }
  114. }
  115. /// 获取键值对(Map)
  116. ///
  117. /// [key] 存储的键
  118. /// [defaultValue] 默认值(可选)
  119. ///
  120. /// 返回 Map 对象,如果不存在或解析失败则返回 null 或默认值
  121. ///
  122. /// 示例:
  123. /// ```dart
  124. /// final user = await LocalStorage.getMap('user');
  125. /// // 返回:{'name': 'John', 'age': 30}
  126. /// ```
  127. static Future<Map<String, dynamic>?> getMap(String key, {Map<String, dynamic>? defaultValue}) async {
  128. try {
  129. final prefs = await _prefsAsync;
  130. final jsonString = prefs.getString(key);
  131. if (jsonString == null) {
  132. return defaultValue;
  133. }
  134. // 将 JSON 字符串解析为 Map
  135. final decoded = jsonDecode(jsonString) as Map<String, dynamic>;
  136. return decoded;
  137. } catch (e) {
  138. // 如果解析失败,返回默认值或 null
  139. return defaultValue;
  140. }
  141. }
  142. // ==================== List 操作 ====================
  143. /// 保存列表(List<Map<String, dynamic>>)
  144. ///
  145. /// [key] 存储的键
  146. /// [value] 要保存的列表对象
  147. ///
  148. /// 返回保存是否成功
  149. ///
  150. /// 示例:
  151. /// ```dart
  152. /// await LocalStorage.setList('institutions', [
  153. /// {'id': 10, 'name': '机构1'},
  154. /// {'id': 20, 'name': '机构2'},
  155. /// ]);
  156. /// ```
  157. static Future<bool> setList(String key, List<Map<String, dynamic>> value) async {
  158. try {
  159. // 将 List 转换为 JSON 字符串保存
  160. final jsonString = jsonEncode(value);
  161. final prefs = await _prefsAsync;
  162. return await prefs.setString(key, jsonString);
  163. } catch (e) {
  164. // 如果转换失败,返回 false
  165. return false;
  166. }
  167. }
  168. /// 获取列表(List<Map<String, dynamic>>)
  169. ///
  170. /// [key] 存储的键
  171. /// [defaultValue] 默认值(可选)
  172. ///
  173. /// 返回列表对象,如果不存在或解析失败则返回 null 或默认值
  174. ///
  175. /// 示例:
  176. /// ```dart
  177. /// final institutions = await LocalStorage.getList('institutions');
  178. /// // 返回:[{'id': 10, 'name': '机构1'}, {'id': 20, 'name': '机构2'}]
  179. /// ```
  180. static Future<List<Map<String, dynamic>>?> getList(String key, {List<Map<String, dynamic>>? defaultValue}) async {
  181. try {
  182. final prefs = await _prefsAsync;
  183. final jsonString = prefs.getString(key);
  184. if (jsonString == null) {
  185. return defaultValue;
  186. }
  187. // 将 JSON 字符串解析为 List
  188. final decoded = jsonDecode(jsonString) as List;
  189. // 将 List 中的每个元素转换为 Map<String, dynamic>
  190. return decoded.map((item) => item as Map<String, dynamic>).toList();
  191. } catch (e) {
  192. // 如果解析失败,返回默认值或 null
  193. return defaultValue;
  194. }
  195. }
  196. // ==================== 通用操作 ====================
  197. /// 删除指定 key
  198. static Future<bool> remove(String key) async {
  199. final prefs = await _prefsAsync;
  200. return await prefs.remove(key);
  201. }
  202. /// 清空所有数据
  203. static Future<bool> clear() async {
  204. final prefs = await _prefsAsync;
  205. return await prefs.clear();
  206. }
  207. /// 检查 key 是否存在
  208. static Future<bool> containsKey(String key) async {
  209. final prefs = await _prefsAsync;
  210. return prefs.containsKey(key);
  211. }
  212. /// 获取所有 key
  213. static Future<Set<String>> getKeys() async {
  214. final prefs = await _prefsAsync;
  215. return prefs.getKeys();
  216. }
  217. // ==================== 常用业务方法 ====================
  218. /// 保存 Token
  219. static Future<bool> saveToken(String token) async {
  220. return await setString(AppConstants.keyToken, token);
  221. }
  222. /// 获取 Token
  223. static Future<String?> getToken() async {
  224. return await getString(AppConstants.keyToken);
  225. }
  226. /// 删除 Token
  227. static Future<bool> removeToken() async {
  228. return await remove(AppConstants.keyToken);
  229. }
  230. /// 保存用户信息(JSON 字符串)
  231. static Future<bool> saveUserInfo(Map<String, dynamic> userInfo) async {
  232. return await setMap(AppConstants.keyUserInfo, userInfo);
  233. }
  234. /// 获取用户信息
  235. static Future<Map<String, dynamic>?> getUserInfo() async {
  236. return await getMap(AppConstants.keyUserInfo);
  237. }
  238. /// 删除用户信息
  239. static Future<bool> removeUserInfo() async {
  240. return await remove(AppConstants.keyUserInfo);
  241. }
  242. /// 保存机构信息列表
  243. ///
  244. /// [institutionInfo] 机构信息列表,格式为:
  245. /// ```dart
  246. /// [
  247. /// {
  248. /// "id": 10,
  249. /// "uuid": "38a0d1fe-c08f-11f0-88d5-0242c0a80106",
  250. /// "name": "仙豆仙豆"
  251. /// }
  252. /// ]
  253. /// ```
  254. ///
  255. /// 返回保存是否成功
  256. static Future<bool> saveInstitutionInfo(List<Map<String, dynamic>> institutionInfo) async {
  257. return await setList(AppConstants.keyInstitutionInfo, institutionInfo);
  258. }
  259. /// 获取机构信息列表
  260. ///
  261. /// 返回机构信息列表,如果不存在或解析失败则返回 null
  262. ///
  263. /// 示例:
  264. /// ```dart
  265. /// final institutionInfo = await LocalStorage.getInstitutionInfo();
  266. /// if (institutionInfo != null) {
  267. /// for (var institution in institutionInfo) {
  268. /// print('机构名称: ${institution['name']}');
  269. /// }
  270. /// }
  271. /// ```
  272. static Future<List<Map<String, dynamic>>?> getInstitutionInfo() async {
  273. return await getList(AppConstants.keyInstitutionInfo);
  274. }
  275. /// 删除机构信息列表
  276. ///
  277. /// 返回删除是否成功
  278. static Future<bool> removeInstitutionInfo() async {
  279. return await remove(AppConstants.keyInstitutionInfo);
  280. }
  281. /// 保存登录手机号
  282. static Future<bool> savePhone(String phone) async {
  283. return await setString(AppConstants.keySavedPhone, phone);
  284. }
  285. /// 获取登录手机号
  286. static Future<String?> getPhone() async {
  287. return await getString(AppConstants.keySavedPhone);
  288. }
  289. /// 删除登录手机号
  290. static Future<bool> removePhone() async {
  291. return await remove(AppConstants.keySavedPhone);
  292. }
  293. /// 保存登录密码(原始密码;登录时再进行 MD5 加密)
  294. static Future<bool> savePassword(String password) async {
  295. return await setString(AppConstants.keySavedPassword, password);
  296. }
  297. /// 获取登录密码(原始密码;登录时再进行 MD5 加密)
  298. static Future<String?> getPassword() async {
  299. return await getString(AppConstants.keySavedPassword);
  300. }
  301. /// 删除登录密码
  302. static Future<bool> removePassword() async {
  303. return await remove(AppConstants.keySavedPassword);
  304. }
  305. /// 保存是否记住密码
  306. static Future<bool> saveRememberPassword(bool remember) async {
  307. return await setBool(AppConstants.keyRememberPassword, remember);
  308. }
  309. /// 获取是否记住密码
  310. static Future<bool> getRememberPassword() async {
  311. return await getBool(AppConstants.keyRememberPassword, defaultValue: false) ?? false;
  312. }
  313. /// 删除是否记住密码
  314. static Future<bool> removeRememberPassword() async {
  315. return await remove(AppConstants.keyRememberPassword);
  316. }
  317. }