| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- import 'dart:async';
- import 'dart:convert';
- import 'package:shared_preferences/shared_preferences.dart';
- import 'package:sino_med_cloud/core/constants/app_constants.dart';
- /// 本地存储管理类
- class LocalStorage {
- static SharedPreferences? _prefs;
- static Completer<void>? _initCompleter;
- /// 初始化本地存储
- static Future<void> init() async {
- if (_prefs != null) {
- return;
- }
- _prefs = await SharedPreferences.getInstance();
- _initCompleter?.complete();
- _initCompleter = null;
- }
- /// 确保已初始化(自动初始化,如果未初始化则初始化)
- static Future<void> _ensureInitialized() async {
- if (_prefs != null) {
- return;
- }
-
- // 如果正在初始化,等待初始化完成
- if (_initCompleter != null) {
- await _initCompleter!.future;
- return;
- }
-
- // 开始初始化
- _initCompleter = Completer<void>();
- await init();
- }
- /// 获取 SharedPreferences 实例(内部使用)
- static Future<SharedPreferences> get _prefsAsync async {
- await _ensureInitialized();
- return _prefs!;
- }
- // ==================== String 操作 ====================
- /// 保存字符串
- static Future<bool> setString(String key, String value) async {
- final prefs = await _prefsAsync;
- return await prefs.setString(key, value);
- }
- /// 获取字符串
- static Future<String?> getString(String key, {String? defaultValue}) async {
- final prefs = await _prefsAsync;
- return prefs.getString(key) ?? defaultValue;
- }
- // ==================== Int 操作 ====================
- /// 保存整数
- static Future<bool> setInt(String key, int value) async {
- final prefs = await _prefsAsync;
- return await prefs.setInt(key, value);
- }
- /// 获取整数
- static Future<int?> getInt(String key, {int? defaultValue}) async {
- final prefs = await _prefsAsync;
- return prefs.getInt(key) ?? defaultValue;
- }
- // ==================== Double 操作 ====================
- /// 保存浮点数
- static Future<bool> setDouble(String key, double value) async {
- final prefs = await _prefsAsync;
- return await prefs.setDouble(key, value);
- }
- /// 获取浮点数
- static Future<double?> getDouble(String key, {double? defaultValue}) async {
- final prefs = await _prefsAsync;
- return prefs.getDouble(key) ?? defaultValue;
- }
- // ==================== Bool 操作 ====================
- /// 保存布尔值
- static Future<bool> setBool(String key, bool value) async {
- final prefs = await _prefsAsync;
- return await prefs.setBool(key, value);
- }
- /// 获取布尔值
- static Future<bool?> getBool(String key, {bool? defaultValue}) async {
- final prefs = await _prefsAsync;
- return prefs.getBool(key) ?? defaultValue;
- }
- // ==================== StringList 操作 ====================
- /// 保存字符串列表
- static Future<bool> setStringList(String key, List<String> value) async {
- final prefs = await _prefsAsync;
- return await prefs.setStringList(key, value);
- }
- /// 获取字符串列表
- static Future<List<String>?> getStringList(String key) async {
- final prefs = await _prefsAsync;
- return prefs.getStringList(key);
- }
- // ==================== Map 操作 ====================
- /// 保存键值对(Map)
- ///
- /// [key] 存储的键
- /// [value] 要保存的 Map 对象
- ///
- /// 返回保存是否成功
- ///
- /// 示例:
- /// ```dart
- /// await LocalStorage.setMap('user', {'name': 'John', 'age': 30});
- /// ```
- static Future<bool> setMap(String key, Map<String, dynamic> value) async {
- try {
- // 将 Map 转换为 JSON 字符串保存
- final jsonString = jsonEncode(value);
- final prefs = await _prefsAsync;
- return await prefs.setString(key, jsonString);
- } catch (e) {
- // 如果转换失败,返回 false
- return false;
- }
- }
- /// 获取键值对(Map)
- ///
- /// [key] 存储的键
- /// [defaultValue] 默认值(可选)
- ///
- /// 返回 Map 对象,如果不存在或解析失败则返回 null 或默认值
- ///
- /// 示例:
- /// ```dart
- /// final user = await LocalStorage.getMap('user');
- /// // 返回:{'name': 'John', 'age': 30}
- /// ```
- static Future<Map<String, dynamic>?> getMap(String key, {Map<String, dynamic>? defaultValue}) async {
- try {
- final prefs = await _prefsAsync;
- final jsonString = prefs.getString(key);
- if (jsonString == null) {
- return defaultValue;
- }
- // 将 JSON 字符串解析为 Map
- final decoded = jsonDecode(jsonString) as Map<String, dynamic>;
- return decoded;
- } catch (e) {
- // 如果解析失败,返回默认值或 null
- return defaultValue;
- }
- }
- // ==================== List 操作 ====================
- /// 保存列表(List<Map<String, dynamic>>)
- ///
- /// [key] 存储的键
- /// [value] 要保存的列表对象
- ///
- /// 返回保存是否成功
- ///
- /// 示例:
- /// ```dart
- /// await LocalStorage.setList('institutions', [
- /// {'id': 10, 'name': '机构1'},
- /// {'id': 20, 'name': '机构2'},
- /// ]);
- /// ```
- static Future<bool> setList(String key, List<Map<String, dynamic>> value) async {
- try {
- // 将 List 转换为 JSON 字符串保存
- final jsonString = jsonEncode(value);
- final prefs = await _prefsAsync;
- return await prefs.setString(key, jsonString);
- } catch (e) {
- // 如果转换失败,返回 false
- return false;
- }
- }
- /// 获取列表(List<Map<String, dynamic>>)
- ///
- /// [key] 存储的键
- /// [defaultValue] 默认值(可选)
- ///
- /// 返回列表对象,如果不存在或解析失败则返回 null 或默认值
- ///
- /// 示例:
- /// ```dart
- /// final institutions = await LocalStorage.getList('institutions');
- /// // 返回:[{'id': 10, 'name': '机构1'}, {'id': 20, 'name': '机构2'}]
- /// ```
- static Future<List<Map<String, dynamic>>?> getList(String key, {List<Map<String, dynamic>>? defaultValue}) async {
- try {
- final prefs = await _prefsAsync;
- final jsonString = prefs.getString(key);
- if (jsonString == null) {
- return defaultValue;
- }
- // 将 JSON 字符串解析为 List
- final decoded = jsonDecode(jsonString) as List;
- // 将 List 中的每个元素转换为 Map<String, dynamic>
- return decoded.map((item) => item as Map<String, dynamic>).toList();
- } catch (e) {
- // 如果解析失败,返回默认值或 null
- return defaultValue;
- }
- }
- // ==================== 通用操作 ====================
- /// 删除指定 key
- static Future<bool> remove(String key) async {
- final prefs = await _prefsAsync;
- return await prefs.remove(key);
- }
- /// 清空所有数据
- static Future<bool> clear() async {
- final prefs = await _prefsAsync;
- return await prefs.clear();
- }
- /// 检查 key 是否存在
- static Future<bool> containsKey(String key) async {
- final prefs = await _prefsAsync;
- return prefs.containsKey(key);
- }
- /// 获取所有 key
- static Future<Set<String>> getKeys() async {
- final prefs = await _prefsAsync;
- return prefs.getKeys();
- }
- // ==================== 常用业务方法 ====================
- /// 保存 Token
- static Future<bool> saveToken(String token) async {
- return await setString(AppConstants.keyToken, token);
- }
- /// 获取 Token
- static Future<String?> getToken() async {
- return await getString(AppConstants.keyToken);
- }
- /// 删除 Token
- static Future<bool> removeToken() async {
- return await remove(AppConstants.keyToken);
- }
- /// 保存用户信息(JSON 字符串)
- static Future<bool> saveUserInfo(Map<String, dynamic> userInfo) async {
- return await setMap(AppConstants.keyUserInfo, userInfo);
- }
- /// 获取用户信息
- static Future<Map<String, dynamic>?> getUserInfo() async {
- return await getMap(AppConstants.keyUserInfo);
- }
- /// 删除用户信息
- static Future<bool> removeUserInfo() async {
- return await remove(AppConstants.keyUserInfo);
- }
- /// 保存机构信息列表
- ///
- /// [institutionInfo] 机构信息列表,格式为:
- /// ```dart
- /// [
- /// {
- /// "id": 10,
- /// "uuid": "38a0d1fe-c08f-11f0-88d5-0242c0a80106",
- /// "name": "仙豆仙豆"
- /// }
- /// ]
- /// ```
- ///
- /// 返回保存是否成功
- static Future<bool> saveInstitutionInfo(List<Map<String, dynamic>> institutionInfo) async {
- return await setList(AppConstants.keyInstitutionInfo, institutionInfo);
- }
- /// 获取机构信息列表
- ///
- /// 返回机构信息列表,如果不存在或解析失败则返回 null
- ///
- /// 示例:
- /// ```dart
- /// final institutionInfo = await LocalStorage.getInstitutionInfo();
- /// if (institutionInfo != null) {
- /// for (var institution in institutionInfo) {
- /// print('机构名称: ${institution['name']}');
- /// }
- /// }
- /// ```
- static Future<List<Map<String, dynamic>>?> getInstitutionInfo() async {
- return await getList(AppConstants.keyInstitutionInfo);
- }
- /// 删除机构信息列表
- ///
- /// 返回删除是否成功
- static Future<bool> removeInstitutionInfo() async {
- return await remove(AppConstants.keyInstitutionInfo);
- }
- }
|